对角线 上两点满足abs(x2-x1)=abs(y2-y1),即满足x1+y1=x2+y2 或者x1-y1=x2-y2,贴代码:
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <ctype.h>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
#define eps 1e-8
#define INF 0x7fffffff
#define PI acos(-1.0)
#define seed 31//131,1313
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
//算法1 暴力扫 超时
/*struct Sun
{
int a;
int b;
} p[200000+5];
int main()
{
int n;
int i,j;
while(scanf("%d",&n)!=EOF)
{
int cnt=0;
for(i=0; i<n; i++)
{
scanf("%d%d",&p[i].a,&p[i].b);
}
for(i=0; i<n-1; i++)
{
for(j=i+1; j<n; j++)
{
if(abs(p[i].a-p[j].a)==abs(p[i].b-p[j].b)) cnt++;
}
}
printf("%d\n",cnt);
}
return 0;
}*/
//算法2 优化后的算法
const int MAXN=5000;
int main()
{
int n;
int a[MAXN];
int b[MAXN];
int x,y;
while(scanf("%d",&n)!=EOF)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=0; i<n; i++)
{
scanf("%d%d",&x,&y);
a[x+y]++;
b[x-y+1000]++;
}
int cnt=0;
for(int i=0; i<2000+10; i++)
{
if(a[i]>=2)
{
if(a[i]%2==0) cnt+=a[i]/2*(a[i]-1);
else cnt+=(a[i]-1)/2*a[i];
}
}
for(int i=0; i<2000+10; i++)
{
if(b[i]>=2)
{
if(b[i]%2==0) cnt+=b[i]/2*(b[i]-1);
else cnt+=(b[i]-1)/2*b[i];
}
}
printf("%d\n",cnt);
}
}