hdu 4334 Trouble

有5个数列,将第一,二列合并去重得到s1,再将第三,四列合并去重得到s2,这样就剩下3列了。

然后将s1,s2排序,枚举第5列,每次用x指向s1的头,y指向s2的尾,当取出的3个和恰好为0则退出;

大于0时y--;否则x++!

代码如下:

 

#include<iostream>

#include<stdio.h>

#include<algorithm>

#include<iomanip>

#include<cmath>

#include<cstring>

#include<vector>

#define ll __int64

#define pi acos(-1.0)

#define MAX 50000

using namespace std;

ll a[202],b[202],c[40002],d[40002];

vector<ll>s1,s2;

int main(){

    int t,n,m,i,j,k;

    cin>>t;

    while(t--){

        scanf("%d",&n);

        s1.clear();

        s2.clear();

        for(i=0;i<n;i++) scanf("%I64d",&a[i]);

        for(i=0;i<n;i++) scanf("%I64d",&b[i]);

        for(i=0;i<n;i++)

        for(j=0;j<n;j++){

            s1.push_back(a[i]+b[j]);

        }

        for(i=0;i<n;i++) scanf("%I64d",&a[i]);

        for(i=0;i<n;i++) scanf("%I64d",&b[i]);

        for(i=0;i<n;i++)

        for(j=0;j<n;j++){

            s2.push_back(a[i]+b[j]);

        }

        sort(s1.begin(),s1.end());

        sort(s2.begin(),s2.end());

        c[0]=s1[0];

        for(i=1,j=1;i<s1.size();i++){

            if(s1[i]!=s1[i-1])

                c[j++]=s1[i];

        }

        d[0]=s2[0];

        for(i=1,k=1;i<s2.size();i++){

            if(s2[i]!=s2[i-1])

                d[k++]=s2[i];

        }

        for(i=0;i<n;i++) scanf("%I64d",&a[i]);

        bool flag=0;

        for(i=n-1;i>=0;i--){

            int x=0;

            int y=k-1;

            while(x<j&&y>=0){

                ll temp=c[x]+d[y]+a[i];

                if(temp==0){

                    flag=1;

                    break;

                }

                if(temp>0) y--;

                else x++;

            }

            if(flag) break;

        }

        if(flag) cout<<"Yes"<<endl;

        else cout<<"No"<<endl;

    }

    return 0;

}
View Code

 

 

 

你可能感兴趣的:(HDU)