【CodeForces】[651C]Watchmen

文章字数:381

问题描述

问题分析

由题意可知满足条件的点
必然是x相同或者y相同
(可有等式化简得到)

麻烦的地方在于存在
相同的点
所以计算时需要去除重复

这一题写了有断断续续几个小时
所以思路有点混乱
到后面有点方
所以导致忘记了一些小技巧
然后越方越错
好在最后怼出来了

也是一直想着避免加重
事实上换种思路
也可以想做先加上
然后去除重复的

最后需要注意的是
数据类型要用__int64

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#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

该内容采用 CC BY-NC-SA 4.0 许可协议。

如果对您有帮助或存在意见建议,欢迎在下方评论交流。

加载中...