Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1159 Accepted Submission(s): 375
AC代码:
#include <stdio.h>
#include <algorithm>
using namespace std;
#define ll __int64
ll a[400],b[400],c[400],e[400],u[400];
ll f[400*400],g[400*400];
int flag;
bool cmp( ll x,ll y)
{
return x<y;
}
int main( )
{
int i,tests,j,t;
int n,cnt,cnt1;
scanf("%d",&tests);
while(tests--)
{
cnt=0,cnt1=0;
flag=0;
scanf("%d",&n);
for( i=1;i<=n;i++) scanf("%I64d",&a[i]);
for( i=1;i<=n;i++) scanf("%I64d",&b[i]);
for( i=1;i<=n;i++)
{
for( j=1;j<=n;j++)
{
f[++cnt]=a[i]+b[j];
}
}
for( i=1;i<=n;i++) scanf("%I64d",&c[i]);
for( i=1;i<=n;i++) scanf("%I64d",&e[i]);
for( i=1;i<=n;i++)
{
for( j=1;j<=n;j++)
{
g[++cnt1]=c[i]+e[j];
}
}
for( i=1;i<=n;i++) scanf("%I64d",&u[i]);
sort(f+1,f+cnt+1,cmp);
sort(g+1,g+cnt1+1,cmp);
sort(u+1,u+n+1,cmp);
for( i=1;i<=n;i++)
{
ll tmp=u[i];
j=1,t=cnt;
while(j<=cnt1&&t>=1)//对于这一段,开始用最小的加最大的,如果和小于要查找的话,那么说明大的不够用,小的就加,即j++
反之就 k--了
{
if(g[j]+f[t]==-tmp)
{
flag=1;break;
}
if(g[j]+f[t]<-tmp) j++;
else t--;
}
}
if(flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}