2.19

FaReWElLeRi FaReWElLeRi 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

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)

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

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

 

...全文
评论
收藏 已收藏
分享
返回顶部