uva 1152 4 Values whose Sum is 0 map会超时

来源:互联网 发布:淘宝网真丝围巾 编辑:程序博客网 时间:2024/06/06 20:33


用容器可能会超时,需要手写


解法:

容器1={a+b|a属于A,b属于B}

容器2={c+d|c属于C,d属于D}


遍历容器1的元素x,查找容器2中是否存在-x。


时间复杂度根据不同的写法会有略微不同。


如果时间复杂度记为O(n^2*log(n)),n的大小为4000,题目限时9000MS,可以过,但不能用STL。


/**========================================== *   This is a solution for ACM/ICPC problem * *   @source:uva 1152  *   @type: *   @author: wust_ysk *   @blog:  http://blog.csdn.net/yskyskyer123 *   @email: 2530094312@qq.com *===========================================*/#define REP(i,n)  for(int i=0 ;i<(n) ;i++)#include<cstdio>#include<string>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>using namespace std;typedef long long ll;const int INF =0x3f3f3f3f;const int maxn=4000    ;int A[maxn+4],B[maxn+4];int C[maxn+4],D[maxn+4];int n,cnt;const int MOD=1000000;struct Node{    Node* nex;    int data;    int num;    Node(){}    Node(Node *nex,int data,int num):nex(nex),data(data),num(num){}};struct SE{    Node* key[MOD];    void clear()    {        REP(i,MOD)        {            key[i]=NULL;        }    }    void insert(int x)    {        Node* t;        int k=(x%MOD+MOD)%MOD;        Node* p=key[k];        if(p==NULL)        {            key[k]=new Node( t=NULL,x,1  );            return;        }        while(p->data!=x&&p->nex)        {            p=p->nex;        }        if(p->data!=x) p->nex=new Node(t=NULL,x,1  );        else  p->num++;    }    int count(int x)    {        int k=(x%MOD+MOD)%MOD;        Node *p=key[k];        while(p&&p->data!=x)        {            p=p->nex;        }        if(p==NULL)  return 0;        return p->num;    }}se1,se2;void cal(int k){    Node* p=se1.key[k];    while(p)    {        int x=p->data;        cnt+=p->num*se2.count(-x);        p=p->nex;    }}int main(){    int T,kase=0;scanf("%d",&T);    while(T--)    {        if(kase++)  putchar('\n');        scanf("%d",&n);        REP(i,n)        {            scanf("%d%d%d%d",&A[i],&B[i],&C[i],&D[i]);        }        se1.clear();        se2.clear();        REP(i,n)        {            REP(j,n)            {                se1.insert(A[i]+B[j]);                se2.insert(C[i]+D[j]);            }        }        cnt=0;        for(int i=0;i<MOD;i++)        {           cal(i);        }        printf("%d\n",cnt);    }   return 0;}/*221 1 1 12 2 2 2*/


0 0
原创粉丝点击