Trouble(多校联合)

来源:互联网 发布:中国网络电视全球直播 编辑:程序博客网 时间:2024/05/22 03:37
/* 简单来说题目意思就是这样子了:a+b+c+d+e=0 */   点击打开链接

hash 版:3116ms

#include < iostream >#include <  cstdio  >#include < algorithm>#define         N 220#define    inf 500005typedef  __int64  LL;using  namespace std;LL a[5][N] , b[N*N];struct HASH{LL   v;bool f;}h[inf];int hash(LL val){int  p=val % inf;if(p < 0) p+=inf;while(h[p].f && h[p].v!=val) p=(p+1)%inf;return p;}int main (){//freopen("t.txt","r",stdin);LL n,t,i,j,k,te;for(scanf("%I64d",&t),k=0;k<t;k++){scanf("%I64d",&n);int mt,p,flag=0;memset(h,0,sizeof(h));memset(b,0,sizeof(b));for(i=0 ; i<5 ; i++)for(j=0 ; j<n ; j++)scanf("%I64d",&a[i][j]);for(mt=i=0;i<n;i++){a[4][i]=0-a[4][i];for(j=0;j<n;j++)  {p=hash(a[0][i]+a[1][j]);h[p].f = 1 ; h[p].v =a[0][i]+a[1][j];b[mt++]=a[2][i]+a[3][j];}}for(i=0 ; i<n ; i++){for(j=0 ; j<mt ;j++){te=a[4][i]-b[j];p = hash( te );if(h[p].f) {flag=1;break;}}if( flag ) break;}if(flag) puts("Yes");else     puts( "No");}return 0;} 

夹逼版:1156ms

#include < iostream >#include <  cstdio  >#include < algorithm>#define         N 220typedef  __int64  LL;using  namespace std;LL a[5][N],b[2][N*N];int main (){//freopen("t.txt","r",stdin);LL n,t,i,j,k;for(scanf("%I64d",&t),k=0;k<t;k++){scanf("%I64d",&n);int mt,nt,f=0;memset(a,0,sizeof(a));memset(b,0,sizeof(b));for(i=0 ; i<5 ; i++)for(j=0 ; j<n ; j++)scanf("%I64d",&a[i][j]);for(nt=mt=i=0;i<n;i++){a[4][i]=0-a[4][i];for(j=0;j<n;j++)  {b[0][nt++]=a[0][i]+a[1][j];b[1][mt++]=a[2][i]+a[3][j];}}sort(b[0],b[0]+nt);sort(b[1],b[1]+mt);for(i=0 ; i<n ; i++){int b1=0,b2=mt-1;while(b1<nt && b2>-1){if( f ) break;if(b[0][b1]+b[1][b2]==a[4][i]) f=1;else if(b[0][b1]+b[1][b2]<a[4][i]) b1++;else b2--;}if( f ) break;}if(f) puts("Yes");else  puts( "No");}return 0;} 

超内存版:

#include < iostream >#include <  cstdio  >#include <   map    >#define         N 205typedef  __int64  LL;using  namespace std;map <LL , LL>  m;LL a[5][N],b[2][N*N];int main (){    //freopen("t.txt","r",stdin);    LL n,t,i,j,l,k;    for(scanf("%I64d",&t),k=0;k<t;k++)    {        m.clear();        scanf("%I64d",&n);        int mt,nt;        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        for(i=0 ; i<5 ; i++)            for(j=0 ; j<n ; j++)                scanf("%I64d",&a[i][j]);        for(nt=mt=i=0;i<n;i++)            for(j=0;j<n;j++)                 m[a[0][i]+a[1][j]]=1;bool f=0;        for(i=0 ; i<n ;i++)        {            for(j=0 ; j<n ; j++)                 for(l=0 ; l<n ;l++)    if(m[a[2][i]+a[3][j]+a[4][l]]==1)   {   f=1;break;}   if( f ) break;if( f ) break;        }        if(f) puts("Yes");        else  puts( "No");    }    return 0;}

二分超时版:

#include < iostream >#include <  cstdio  >#include <   map    >#include < algorithm>#define         N 220typedef  __int64  LL;using  namespace std;LL a[5][N],b[2][N*N];map <LL , LL>   m[2];map <LL , LL>::iterator it;int find(LL x,LL y,int r,int l){while(r<=l){int mid=(r+l)/2;if(x==y+b[1][mid]) return 1;else if(x<y+b[1][mid]) l=mid-1;else r=mid+1;}return 0;}int main (){//freopen("t.txt","r",stdin);LL n,t,i,j,k;for(scanf("%I64d",&t),k=0;k<t;k++){scanf("%I64d",&n);int mt,nt,f=0;memset(a,0,sizeof(a));memset(b,0,sizeof(b));m[0].clear();m[1].clear();for(i=0 ; i<5 ; i++)for(j=0 ; j<n ; j++)scanf("%I64d",&a[i][j]);for(nt=mt=i=0;i<n;i++){a[4][i]=0-a[4][i];for(j=0;j<n;j++)  {m[0][a[0][i]+a[1][j]]=1;m[1][a[2][i]+a[3][j]]=1;}}for(it=m[0].begin();it!=m[0].end();it++)b[0][nt++]=it->first;for(it=m[1].begin();it!=m[1].end();it++)b[1][mt++]=it->first;for(i=0 ; i<n ; i++){for(j=0;j<nt;j++){f=find(a[4][i],b[0][j],0,mt);if( f ) break;}if( f ) break;} if(f) puts("Yes");else  puts( "No");}return 0;} 

 

原创粉丝点击