[牛客周赛复盘] 牛客周赛 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值