记录一下每个对角线上有几个,然后就可以算了
#include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<vector> #include<algorithm> using namespace std; const int maxn=2000+10; int n; long long w1[maxn]; long long w2[maxn]; long long ans; int main() { int n; scanf("%d",&n); ans=0; memset(w1,0,sizeof w1); memset(w2,0,sizeof w2); for(int i=1; i<=n; i++) { int x,y; scanf("%d%d",&x,&y); int p=1000; p=p+(x-1); p=p-(y-1); w1[p]++; p=1000; p=p+x-1; p=p-(1000-y); w2[p]++; } for(int i=1; i<=1999; i++) if(w1[i]!=1&&w1[i]!=0) ans=ans+(w1[i]-1)*w1[i]/2; for(int i=1; i<=1999; i++) if(w2[i]!=1&&w2[i]!=0) ans=ans+(w2[i]-1)*w2[i]/2; printf("%lld ",ans); return 0; }