哈希
我太屎啦,以后一定不能再犯写while循环忘了更改循环条件的错误,导致浪费这么长时间来调试
#include <iostream> #include <cstdio> using namespace std; const int mod=10000003; const int maxn=4100; struct { int data,sum,next; }node[maxn*maxn]; int head[mod],f[4][maxn],num; void insert(int p) { int k=(p%mod+mod)%mod; int i=head[k]; while(i!=-1) { if(node[i].data==p) { node[i].sum++; break; } i=node[i].next; } if(i==-1){ node[num].data=p;node[num].next=head[k];node[num].sum=1; head[k]=num; num++; } } int find(int p) { int k=(p%mod+mod)%mod; int i=head[k]; while(i!=-1) { if(node[i].data==p) return node[i].sum; i=node[i].next; } return 0; } int main() { int n; scanf("%d",&n); num=0; int i,j; memset(head,-1,sizeof(head)); for(i=0;i<n;i++) { scanf("%d%d%d%d",&f[0][i],&f[1][i],&f[2][i],&f[3][i]); } for(i=0;i<n;i++) { for(j=0;j<n;j++) { insert(f[0][i]+f[1][j]); } } int tot=0; for(i=0;i<n;i++) { for(j=0;j<n;j++) { tot+=find(-(f[2][i]+f[3][j])) ; } } cout<<tot<<endl; return 0; }