最开始看到这题SB的直接暴力,,卧槽,以后这种习惯要改,,2B青年穷举,普通青年对C二分,文艺青年对A+B二分。这就是这题的解释。因为500,500,500,1000的数据太大,所以只能二分,A+B二分的复杂度前者是500*500,后者是1000*500*log2(500*500),这是不会超时的,合并A+B的时候还有一点技巧就是讲A,B,C较大的两个求出来,然后合并。其实不这样也是可以的。这是处理的一个技巧;
#include<iostream> using namespace std; #include<stdio.h> #include<algorithm> __int64 a[505],b[505],c[505],d[505*505]; __int64 f[1005]; int main() { int L, N, M; int s; int i,j,k; int q=1; while(cin>>L>>N>>M) { for(i=0;i<L;i++) scanf("%I64d",&a[i]); for(i=0;i<N;i++) scanf("%I64d",&b[i]); k=0; for(i=0;i<L;i++) for(j=0;j<N;j++) d[k++]=a[i]+b[j]; sort(d,d+k); for(i=0;i<M;i++) scanf("%I64d",&c[i]); sort(c,c+M); scanf("%d",&s); for(i=0;i<s;i++) scanf("%I64d",&f[i]); cout<<"Case "<<q++<<":"<<endl; for(int p=0;p<s;p++) { int leap=0; for(i=0;i<M;i++) { int low=0,high=k-1; int mid=(low+high)>>1; while(low<=high) { mid=(low+high)>>1; if(c[i]+d[mid]==f[p]){leap=1;break;} else if(d[mid]+c[i]<f[p])low=mid+1; else high=mid-1; } if(leap)break; } if(leap==1)cout<<"YES"<<endl; else cout<<"NO"<<endl; } } return 0; }
[ Copy to Clipboard ]
[ Save to File]