和POJ1840有点像,但这里只需判断有没有解,一个简单的hash就可以搞定,以后不能滥用vector,自己手写邻接表。
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector> typedef __int64 LL; const int MAXN = 205; const LL prime = 1000007; int head[prime + 3], e, next[MAXN * MAXN]; LL val[MAXN * MAXN]; LL s1[MAXN], s2[MAXN], s3[MAXN], s4[MAXN], s5[MAXN]; int hash(LL sum) { int key; if(sum > 0) key = (int)(sum % prime); else key = (int)(-sum % prime); return key ; } void add(int key, LL sum) { val[e] = sum; next[e] = head[key]; head[key] = e ++; } int main(){ int N, n, i, j, k, key; LL sum; scanf("%d", &N); while(N --) { scanf("%d", &n); for(i = 0; i < n; i ++) scanf("%I64d", &s1[i]); for(i = 0; i < n; i ++) scanf("%I64d", &s2[i]); for(i = 0; i < n; i ++) scanf("%I64d", &s3[i]); for(i = 0; i < n; i ++) scanf("%I64d", &s4[i]); for(i = 0; i < n; i ++) scanf("%I64d", &s5[i]); memset(head, -1, sizeof head); e = 0; for(i = 0; i < n; i ++) for(j = 0; j < n; j ++) { sum = s1[i] + s2[j]; key = hash(sum); add(key, sum); } bool flag = false; for(i = 0; i < n && !flag; i ++) for(j = 0; j < n && !flag; j ++) for(k = 0; k < n; k ++) { sum = s3[i] + s4[j] + s5[k]; int s = hash(-sum); for(int x = head[s]; x != -1; x = next[x]) { if(sum + val[x] == 0) flag = true; if(flag) break ; } } if(flag) printf("Yes\n") ; else printf("No\n") ; } return 0 ; }