由题意可知满足条件的点
必然是x相同或者y相同
(可有等式化简得到)
麻烦的地方在于存在
相同的点
所以计算时需要去除重复
这一题写了有断断续续几个小时
所以思路有点混乱
到后面有点方
所以导致忘记了一些小技巧
然后越方越错
好在最后怼出来了
也是一直想着避免加重
事实上换种思路
也可以想做先加上
然后去除重复的
最后需要注意的是
数据类型要用__int64
#include<stdio.h>
#include<algorithm>
using namespace std;
struct xy {
int x,y;
} node[200200];
bool cmpx(xy A,xy B) {
if(A.x==B.x)
return A.y<B.y;
else
return A.x<B.x;
}
bool cmpy(xy A,xy B) {
if(A.y==B.y)
return A.x<B.x;
else
return A.y<B.y;
}
int main() {
int n;
while(scanf("%d",&n)!=EOF) {
for(int i=0; i<n; i++) {
scanf("%d %d",&node[i].x,&node[i].y);
}
__int64 res=0;
sort(node,node+n,cmpx);
__int64 t=1,ct=1;
for(int i=1; i<n; i++) {
if(node[i].x==node[i-1].x) {
t++;
if(node[i].y==node[i-1].y)
ct++;
else {
res-=ct*(ct-1)/2;
ct=1;
}
} else {
res+=t*(t-1)/2;
res-=ct*(ct-1)/2;
ct=1;
t=1;
}
}
if (ct>1) {
res-=ct*(ct-1)/2;
}
if (t>1) {
res+=t*(t-1)/2;
}
sort(node,node+n,cmpy);
t=1;
for(int i=1; i<n; i++) {
if(node[i].y==node[i-1].y) {
t++;
} else {
res+=t*(t-1)/2;
t=1;
}
}
if(t>1)
res+=t*(t-1)/2;
printf("%I64d
",res);
}
return 0;
}