例题 8-2 和为0的4个值 UVa 1152

来源:互联网 发布:java软件开发工具 编辑:程序博客网 时间:2024/05/22 10:25

分析:现将集合AB中的元素求和保存起来,再将CD中的元素求和保存起来,然后再枚举看看两数组中是否存在相反数,在分别计算就可以了。按照书上说的分别将和保存在有序数组和map中,map果然超时了。

有序数组2379ms

#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#include<map>#include<sstream>using namespace std;const int maxn=4005;int a[maxn],b[maxn],c[maxn],d[maxn];int num[maxn*maxn];int num2[maxn*maxn];int main(){    int T,n,p;    cin>>T;    while(T--){        cin>>n;        for(int i=0;i<n;i++){            scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);        }        int cnt=0,cnt2=0;        for(int i=0;i<n;i++){            for(int j=0;j<n;j++){               num[cnt++]=a[i]+b[j];            }        }          for(int i=0;i<n;i++){            for(int j=0;j<n;j++){            num2[cnt2++]=c[i]+d[j];            }        }        int ans=0;        sort(num,num+cnt);        sort(num2,num2+cnt2);       // int p=num[0];        for(int i=0;i<cnt;){            p=num[i];            int n1=upper_bound(num,num+cnt,p)-lower_bound(num,num+cnt,p); //由于这两个函数是二分写的,所以速度较快。            int n2=upper_bound(num2,num2+cnt2,-p)-lower_bound(num2,num2+cnt2,-p);            ans+=n1*n2;            i+=n1;        }        cout<<ans<<endl;        if(T)printf("\n");    }    return 0;}

用map超时代码:

#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#include<map>#include<sstream>using namespace std;const int maxn=4005;int a[maxn],b[maxn],c[maxn],d[maxn];map<int,int>num;map<int,int>num2;map<int,int>::iterator it,i2;int main(){    int T,n;    cin>>T;    while(T--){        cin>>n;        for(int i=0;i<n;i++){            scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);        }        for(int i=0;i<n;i++){            for(int j=0;j<n;j++){               num[a[i]+b[j]]++;            }        }          for(int i=0;i<n;i++){            for(int j=0;j<n;j++){               num2[c[i]+d[j]]++;            }        }        int ans=0;        for(it=num.begin();it!=num.end();it++){            int t=-(it->first),p=it->second;            for(i2=num2.begin();i2!=num2.end();i2++){                if(i2->first==t){                    ans+=p*i2->second;                    break;                }            }        }        cout<<ans<<endl;        if(T)printf("\n");    }    return 0;}



0 0