题意:给n个坐标,问有多少个坐标对的x值相等或y值相等
题解:分别排序,分别求出x相等和y相等的组合,最后减去x和y均相等的
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
struct node{
int x, y;
}p[200010];
bool cmp1(node a, node b){
return a.x<b.x;
}
bool cmp2(node a, node b){
return a.y<b.y;
}
bool cmp3(node a, node b){
if(a.x == b.x) return a.y<b.y;
return a.x<b.x;
}
int main(){
scanf("%d", &n);
for(int i = 1; i<=n; i++){
scanf("%d%d", &p[i].x, &p[i].y);
}
sort(p+1, p+1+n, cmp1);
long long ans = 0;
long long cnt = 1;
for(int i = 2; i<=n; i++){
if(p[i].x == p[i-1].x){
cnt++;
}
else{
ans+=cnt*(cnt-1)/2;
//cout<<" "<<ans<<endl;
cnt = 1;
}
}
ans+=cnt*(cnt-1)/2;
//cout<<ans<<endl;
sort(p+1, p+1+n, cmp2);
cnt = 1;
for(int i = 2; i<=n; i++){
if(p[i].y == p[i-1].y){
cnt++;
}
else{
ans+=cnt*(cnt-1)/2;
cnt = 1;
}
}
ans+=cnt*(cnt-1)/2;
//cout<<ans<<endl;
sort(p+1, p+1+n, cmp3);
cnt = 1;
int sum = 0;
for(int i = 2; i<=n; i++){
if(p[i].x == p[i-1].x && p[i].y == p[i-1].y){
cnt++;
}
else{
ans-=cnt*(cnt-1)/2;
cnt = 1;
}
}
ans -= cnt*(cnt-1)/2;
//cout<<sum<<endl;
printf("%I64d\n", ans);
return 0;
}