这题比赛的时候不是TLE就是是MLE,各种蛋疼……尝试了hash , 二分查找,map都TLE了
比完赛,发现时我们的hash有一点写错了,改完就ac了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
ll set[5][210];
ll tab[400010];
const int mm=1000007;
struct HashTbale
{
int size,h[mm],p[44444];
ll s[44444];
void insert(ll x)
{
int i,id=(x%mm+mm)%mm; // 比赛的后就错在这了,写成了 id=x%mm 万一x为负数,那么id也为负数了
for(i=h[id];i>=0;i=p[i])
if(s[i]==x)return;
s[size]=x,p[size]=h[id],h[id]=size++;
return ;
}
int find(ll x)
{
int i,id=(x%mm+mm)%mm;
for(i=h[id];i>=0;i=p[i])
if(s[i]==x)return 1;
return 0;
}
void clear()
{
size=0;
memset(h,-1,sizeof(h));
}
}g;
int main()
{
int ca,n,cas=1;
scanf("%d",&ca);
while(ca--)
{
scanf("%d",&n);
for(int i=0;i<5;i++)
for(int j=0;j<n;j++)
{
scanf("%I64d",&set[i][j]);
if(i>=2) set[i][j]=-set[i][j];
}
g.clear();
int cnt=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
tab[cnt++]=set[0][i]+set[1][j];
g.insert(set[0][i]+set[1][j]);
}
sort(tab,tab+cnt);
int k=1;
for(int i=1;i<cnt;i++)
if(tab[i]!=tab[k-1]) tab[k++]=tab[i];
sort(set[2],set[2]+n);
sort(set[3],set[3]+n);
sort(set[4],set[4]+n);
bool ok=1;
for(int i=0;i<n&&ok;i++)
{
if(set[2][i]+set[3][n-1]+set[4][n-1]>=tab[0]&&set[2][i]+set[3][0]+set[4][0]<=tab[k-1])
for(int j=0;j<n&&ok;j++)
if(set[2][i]+set[3][j]+set[4][n-1]>=tab[0]&&set[2][i]+set[3][j]+set[4][0]<=tab[k-1])
for(int r=0;r<n&&ok&&(set[2][i]+set[3][j]+set[4][r])<=tab[k-1];r++)
if((set[2][i]+set[3][j]+set[4][r])>=tab[0]&&g.find(set[2][i]+set[3][j]+set[4][r])) ok=0;
}
puts(ok?"No":"Yes");
}
return 0;
}