题意
思路:
由于
a
a
a序列是一个不下降子序列,所以这个序列的前缀和之间的差(即元素大小)必定也是不下降的。
考虑记录每相邻两个前缀和的差,开两个数组,一个存原数据,另一个进行排序。
两数组逐位比较,若不相等则不合法。
Code
#include <bits/stdc++.h>
using namespace std;
int t,n,k;
long long a[100001],b[100001],c[100001];
int main() {
cin >> t;
while(t--) {
bool flag=false;
cin >> n >> k;
a[0]=0LL;
for (int i=1;i<=k;i++) {
cin >> a[i];
b[i]=a[i]-a[i-1];//b数组存有序前缀和差
c[i]=a[i]-a[i-1];//c数组存原数据
}
if (n!=k) b[1]=c[1]=ceil(a[1]*1.0/(n-k+1));//此处要注意,若没给出全序列的前缀和,则要特判前n-k个元素能否构成不下降序列,此处利用贪心思想,
//将前n-k项全设成1,若前缀和依然不合法,则输出"NO"。
sort(b+1,b+k+1);
for (int i=1;i<=k;i++) {
if (c[i]!=b[i]) {//逐位比较
cout << "NO\n";
flag=true;
break;
}
}
if (!flag) cout << "YES\n";
}
return 0;
}