2.19

算法-刘子函 2024-02-19 16:02:58

CF.1738B - Prefix Sum Addicts

https://codeforces.com/problemset/problem/1738/B

输入 T(≤1e5)表示T组数据。所有数据的n之和 ≤1e5。
每组数据输入nk(1≤k≤n≤1e5)和k个整数,范围[-1e9,1e9]。
这 k个数是一个长为n的非降数组的前缀和的最后k项(从左到右)是否存在这样的非降数组?输出 Yes 或 NO。

首先肯定是用前缀和计算出整个数组的后K个元素,判断其是否非递减,但是这样是还不够的。

在k>1的前提下,设s为前缀和数组,那么s[n-k+2]-s[n-k+1]=a[n-k+2]可以计算出a[n-k+2],是数组中已知的第一个元素,前n-k个元素未知

这时我们把前面的元素a[i]全部放大为a[n-k+2],如果此时不满足s[n-k+1] <= a[n-k+2]*(n-k+1)的话,说明不存在这样的数组,反之则存在这样的数组。

def cf1738B(n,k,nums):
    nums = [0]*(n-k+1)+nums
    if k == 1:
        print("Yes")
        return 0
    a = [0]*(n+1)
    for i in range(n-k+2,n+1):
        a[i] = nums[i]-nums[i-1]
    for i in range(n-k+2,n):
        if a[i] > a[i+1]:
            print("No")
            return 0
    if nums[n - k + 1] > a[n - k + 2] * (n - k + 1):
        print("No")
        return 0
    print("Yes")
    return 0
if __name__ == "__main__":
    T = int(input())
    for _ in range(T):
        n,k = map(int, input().split())
        nums = [int(i) for i in input().split()]
        cf1738B(n,k,nums)

关于这题的数组构成方法,官解中给出了其中一种可能的组成方法(最优解法):

 原理也是上面讲到的放缩,可以自己推推看。

 

...全文
160 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

325

社区成员

发帖
与我相关
我的任务
社区描述
一个供Leaders学习交流的地方
c++javapython 技术论坛(原bbs) 广东省·深圳市
社区管理员
  • 叫我胡萝北
  • CheungZzzc
  • szu_gexu
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧