题意:给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; }