[2016-03-08][codeforces][651][C][Watchmen]

Posted 红洋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[2016-03-08][codeforces][651][C][Watchmen]相关的知识,希望对你有一定的参考价值。

[2016-03-08][codeforces][651][C][Watchmen]
  • 时间:2016-03-08 23:29:35 星期二
  • 题目编号:CF 651 C. Watchmen
  • 题目大意:
    • 给定n个点,求n个点有多少对点使得 |x1 - x2| + |y1 - y2| = ((x1 - x2)^2 + (y1 - y2)^2)^0.5
  • 输入:n n对点
  • 输出:对数
  • 分析:
    • 如果两个点x,y坐标都不一样,那么前者是直角三角形两边之和,后者是三角形的第三条变,所以,满足上式当且仅当两个点x坐标或者y坐标一样
  • 方法:
    • 根据分析,问题等价于求n个点中,有几对点x坐标或者y坐标相同
    • 枚举所有坐标,分别计算对应x,y相同的数目,减去坐标相同的点
    • 直接枚举i,然后枚举j会超时,
    • 这时候先sort按x排序,然后x相同的一定相邻,直接计算相邻的数目即可
    • 然后再sort按y排序,同上,
    • 第三次枚举相同的就不用再sort,直接在y排序完之后的基础上比较即可
  • 解题过程遇到问题:
    • 当数量比较大的时候,ans或者是cnt*(cnt - 1)会超过int

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
typedef long long LL;
#define CLR(x,y) memset((x),(y),sizeof((x)))
#define FOR(x,y,z) for(int (x)=(y);(x)<(z);++(x))
#define FORD(x,y,z) for(int (x)=(y);(x)>=(z);--(x))
#define FOR2(x,y,z) int (x);for((x)=(y);(x)<(z);++(x))
#define FORD2(x,y,z) int (x);for((x)=(y);(x)>=(z);--(x))



const int maxn = 200000 + 10;
struct Point{
        int x,y;
        bool operator == (const Point & a)const {
                return a.x==x && a.y == y;
        }
}p[maxn];
bool cmp1(Point & a,Point & b){
        return a.x < b.x || (a.x == b.x && a.y < b.y);
}
bool cmp2(Point & a,Point & b){
        return a.y < b.y || (a.y == b.y && a.x < b.x);
}
int main(){
        //freopen("in.txt","r",stdin);
        //freopen("out.txt","w",stdout);
        int n;LL ans = 0;
        scanf("%d",&n);
        FOR(i,0,n)     scanf("%d%d",&p[i].x,&p[i].y);
        sort(p,p+n,cmp1);
        for(int i = 0;i < n ;){
                int cnt = 0;
                FOR2(j,i,n){
                        if(p[j].x == p[i].x)    ++cnt;
                        else break;
                }
                ans += (long long)1 * (cnt - 1)*cnt/2;
                i = j;
        }
        sort(p,p+n,cmp2);
        for(int i = 0;i < n ;){
                int cnt = 0;
                FOR2(j,i,n){
                        if(p[j].y == p[i].y)    ++cnt;
                        else break;
                }
                ans += (long long)1*(cnt - 1)*cnt/2;
                i = j;
        }
        for(int i = 0;i < n ;){
                int cnt = 0;
                FOR2(j,i,n){
                        if(p[j] == p[i])        ++cnt;
                        else break;
                }
                ans -= (long long)1*(cnt - 1)*cnt/2;
                i = j;
        }
        printf("%I64d\n",ans);
        return 0;
}  









以上是关于[2016-03-08][codeforces][651][C][Watchmen]的主要内容,如果未能解决你的问题,请参考以下文章

[2016-03-08][651][codeforces][B][Beautiful Paintings]

switch结构2016/03/08

codeforces上怎么看测试数据

如何看codeforces做了多少题

codeforces上怎么看测试数据

codeforces比赛后怎么看题解和答案