比賽的時候寫hash,一直超時,後來才知道原來我沒把相同的值去掉,就差一點優化我就放棄了,以後還是多想想。
[cpp]
#include<iostream>
#include<cstdlib>
#include<stdio.h>
#include<memory.h>
#define ll __int64
#define mm 100007
using namespace std;
ll sum[5][210];
struct Node
{
ll real;
}node[40010];
int hash[mm],next[40010];
int cnt;
void add(ll key)
{
ll tem=key%mm;
if(tem<0) tem+=mm;
int i=hash[tem];
while(i!=-1)
{
if(key==node[i].real)
return;
i=next[i];
}
node[cnt].real=key;
next[cnt]=hash[tem];
hash[tem]=cnt++;
return ;
}
int find(ll tem)
{
ll key=(-tem)%mm;
if(key<0) key+=mm;
int i=hash[key];
while(i!=-1)
{
if(node[i].real+tem==0)
return 1;
i=next[i];
}
return 0;
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<5;i++)
for(int j=0;j<n;j++)
scanf("%I64d",&sum[i][j]);
memset(hash,-1,sizeof(hash));
cnt=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
add(sum[0][i]+sum[1][j]);
}
bool flag=false;
for(int i=0;i<n&&!flag;i++)
for(int j=0;j<n&&!flag;j++)
for(int k=0;k<n&&!flag;k++)
{
if(find(sum[2][i]+sum[3][j]+sum[4][k]))
{
flag=true;
break;
}
}
if(flag)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}