题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks
题意:
给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数。
问合法的x有多少个。题目保证这k个数完全不同。
题解:
显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了。
这里 x+a,x+b,x+c是递增的。这里我把这个序列叫做A序列
然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我们确定了A序列的第一个数,那么就可以确定一个x,然后用二分来判断这个x能不能使得B序列中每个数出现,如果能,就把这个x放进容器。
然后就可以枚举每个A序列的数作为开头。
1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4 5 const int N=2007; 6 int n,k,a[N],b[N]; 7 set<int>st; 8 9 int main(){ 10 scanf("%d%d",&n,&k); 11 F(i,1,n)scanf("%d",a+i),a[i]+=a[i-1]; 12 sort(a+1,a+1+n); 13 F(i,1,k)scanf("%d",b+i); 14 sort(b+1,b+1+k); 15 F(i,1,n) 16 { 17 int flag=1,x=b[1]-a[i]; 18 F(j,1,k) 19 { 20 int tmp=b[j]-x; 21 int idx=lower_bound(a+i,a+n+1,tmp)-a; 22 if(idx>n||a[idx]!=tmp ){flag=0;break;} 23 } 24 if(flag)st.insert(a[i]); 25 } 26 printf("%d\n",(int)st.size()); 27 return 0; 28 }
时间: 2024-10-09 15:40:47