325
社区成员




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)
关于这题的数组构成方法,官解中给出了其中一种可能的组成方法(最优解法):
原理也是上面讲到的放缩,可以自己推推看。