[牛客周赛复盘] 牛客周赛 Round 28 20240114
总结
- 这周据说难度对标abc,根本扯淡。。
- E比较有难度,D赛中没想出来正数有啥用,直接前缀和莽F交了。
- A 模拟
- B 模拟
- C 模拟
- D 滑窗
- E 数学找规律
- F 前缀和+有序集合
A\B
1. 题目描述
2. 思路分析
- 按题意模拟。
3. 代码实现
def solve():
print(sum(RI()))
def solve():
s, = RS()
ans = []
for i in range(len(s)-1):
ans.append(s[i:i+2])
ans.sort()
print(*ans,sep='\n')
小红的炸砖块
链接: 小红的炸砖块
1. 题目描述
2. 思路分析
- 用一个长为列宽的数组a记录每列当前最高砖块的行坐标即可。
- 炸x,y的时候可以判断a[y]<=x,即y列的x位置是否有砖块。
3. 代码实现
def solve():
m,n,k = RI()
a = [0]*n
for _ in range(k):
x,y = RI()
x -= 1
y -= 1
if a[y] <= x:
a[y] += 1
for i in range(m):
ans = ['.']*n
for j in range(n):
if a[j] <= i:
ans[j] = '*'
print(*ans,sep='')
小红统计区间(easy)
链接: 小红统计区间(easy)
1. 题目描述
2. 思路分析
- 全是正数,那么可以滑窗,复杂度O(n)
- 维护[j,i]区间,使这个区间和恰好不到k,那么j向左一下就能到k,所以把所有j(窗首)加起来即可。
- 注意由于这个窗可能为空,所以双指针写法比队列方便。
3. 代码实现
# ms
def solve2():
n, k = RI()
a = RILST()
s = ans = 0
q = deque()
for i, v in enumerate(a):
q.append(i)
s += v
while q and s >= k:
s -= a[q.popleft()]
ans += q[0] if q else i + 1
print(ans)
def solve():
n, k = RI()
a = RILST()
j = s = ans = 0
for i, v in enumerate(a):
s += v
while j <= i and s >= k:
s -= a[j]
j += 1
ans += j
print(ans)
小红的好数组
链接: 小红的好数组
1. 题目描述
2. 思路分析
- 长为三的子段和全是偶数的话,显然可以所有数据全填偶数。而1~k里一共m=k//2个偶数,每个位置填任意偶数是独立的。显然方案数是pow(m,n)。
- 同理,在这些位置中选一些奇数,每个位置有x=k-m个奇数,也是独立事件。只需讨论一下奇数偶数的位置和个数即可。
- 在纸上画了一下,发现合法好数组一定是121 121 121 …(这里12代表奇数偶数) 三个一循环的数,且可以从中任意位置截取。
- 即开始位置共有三种:[1]21121121…;[2]11211211…;[1]12112112…。
- 分别讨论这三种,然后计算1和2的数量即可,这里我只计算2的数量m(因为每个循环节里只有1个2),取个模分类讨论即可。那么1的数量就是n-m。
3. 代码实现
def solve():
n, k = RI()
a, b = k // 2, (k + 1) // 2 # 1~k的偶数个数,奇数个数
# 121 121 121 三个一循环
ans = pow(a, n, MOD) # 全填偶数
x, y = divmod(n, 3)
# 121开头
two = x + int(y >= 2)
ans += pow