GitBook

这里写图片描述

由题意可知满足条件的点 必然是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\n",res);
	}
	return 0;
}

题目地址:【CodeForces】[651C]Watchmen