思路:哈希存入相反数
注意:HDU不支持long long要使用__int64
#include<cstdio> #include<cstring> #define mod 401704//开到所有数据十倍大左右 using namespace std; bool flag[mod]; __int64 m[5][210],hash[mod]; int judge(__int64 x) { int s=x%mod; if(s<0) s+=mod;//将负数转正 /*while(x<0) x+=mod; int s=x%mod; TLE*/ while(flag[s]&&hash[s]!=x) s=(s+1)%mod;//线性探测再散列 return s; }//返回哈希地址 int main() { int T,n; scanf("%d",&T); while(T--){ scanf("%d",&n); memset(flag,0,sizeof(flag)); for(int i=0;i<5;i++) for(int j=0;j<n;j++) scanf("%I64d",&m[i][j]); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ __int64 sum=-(m[0][i]+m[1][j]); int t=judge(sum); flag[t]=1; hash[t]=sum; } } bool sign=false; for(int i=0;i<n&&!sign;i++){ for(int j=0;j<n&&!sign;j++){ for(int k=0;k<n&&!sign;k++){ __int64 sum=m[2][i]+m[3][j]+m[4][k]; int t=judge(sum); if(flag[t]) sign=true; } } } if(sign) printf("Yes "); else printf("No "); } return 0; }