您的位置:首页 > 其它

HDU 4334 Trouble

2012-08-25 16:51 267 查看
和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 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: