直接用set会T掉,n^3logn遭不住
用hash不知道能不能A,还没试过
果然two-point还是强,前2个加在一起,3,4两个加在1起,都从小到大排序,然后枚举5,
l=1,r=n*n,根据大小调整看找不着的到,然后输出,
这么水的题又T又WA,我要菜的哭了
sort(num1+1,num1+1+n*n)这里后面忘记加1了QAQ
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxl 210
using namespace std;
int n,cas;
bool flag;
long long a[6][maxl];
long long num1[maxl*maxl],num2[maxl*maxl];
inline void prework()
{
scanf("%d",&n);
for(int i=1;i<=5;i++)
for(int j=1;j<=n;j++)
scanf("%lld",&a[i][j]);
}
inline void mainwork()
{
flag=false;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
num1[(i-1)*n+j]=a[1][i]+a[2][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
num2[(i-1)*n+j]=a[3][i]+a[4][j];
sort(num1+1,num1+n*n+1);
sort(num2+1,num2+n*n+1);
sort(a[5]+1,a[5]+1+n);
int l,r;
for(int i=1;i<=n && !flag;i++)
{
l=1;r=n*n;
while(r>=1 && l<=n*n && !flag)
{
if(num1[l]+num2[r]+a[5][i]<0)
l++;
else
if(num1[l]+num2[r]+a[5][i]>0)
r--;
else
flag=true;
}
}
}
inline void print()
{
if(flag)
printf("Yes\n");
else
printf("No\n");
}
int main()
{
int t;
scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}