【CodeForces】[651C]Watchmen

这里写图片描述

由题意可知满足条件的点
必然是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

posted @ 2016-05-30 04:11  BoilTask  阅读(11)  评论(0编辑  收藏  举报