hdu 4334 Trouble
有5个数列,将第一,二列合并去重得到s1,再将第三,四列合并去重得到s2,这样就剩下3列了。
然后将s1,s2排序,枚举第5列,每次用x指向s1的头,y指向s2的尾,当取出的3个和恰好为0则退出;
大于0时y--;否则x++!
代码如下:
#include<iostream> #include<stdio.h> #include<algorithm> #include<iomanip> #include<cmath> #include<cstring> #include<vector> #define ll __int64 #define pi acos(-1.0) #define MAX 50000 using namespace std; ll a[202],b[202],c[40002],d[40002]; vector<ll>s1,s2; int main(){ int t,n,m,i,j,k; cin>>t; while(t--){ scanf("%d",&n); s1.clear(); s2.clear(); for(i=0;i<n;i++) scanf("%I64d",&a[i]); for(i=0;i<n;i++) scanf("%I64d",&b[i]); for(i=0;i<n;i++) for(j=0;j<n;j++){ s1.push_back(a[i]+b[j]); } for(i=0;i<n;i++) scanf("%I64d",&a[i]); for(i=0;i<n;i++) scanf("%I64d",&b[i]); for(i=0;i<n;i++) for(j=0;j<n;j++){ s2.push_back(a[i]+b[j]); } sort(s1.begin(),s1.end()); sort(s2.begin(),s2.end()); c[0]=s1[0]; for(i=1,j=1;i<s1.size();i++){ if(s1[i]!=s1[i-1]) c[j++]=s1[i]; } d[0]=s2[0]; for(i=1,k=1;i<s2.size();i++){ if(s2[i]!=s2[i-1]) d[k++]=s2[i]; } for(i=0;i<n;i++) scanf("%I64d",&a[i]); bool flag=0; for(i=n-1;i>=0;i--){ int x=0; int y=k-1; while(x<j&&y>=0){ ll temp=c[x]+d[y]+a[i]; if(temp==0){ flag=1; break; } if(temp>0) y--; else x++; } if(flag) break; } if(flag) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }