返回顶部

Codeforces Round #345 (Div. 1) A. Watchmen (数学,map)

  • 题意:给你\(n\)个点,求这\(n\)个点中,曼哈顿距离和欧几里得距离相等的点对数.

  • 题解: 不难发现,当两个点的曼哈顿距离等于欧几里得距离的时候它们的横坐标或者纵坐标至少有一个相同,可以在纸上画一画,当两点不满足上文所说的情况时,他们的曼哈顿距离一定大于直线距离,因为三角形的两边必定大于第三边,然后我们边输入边求,用桶分别存横和纵坐标,每次出现都将目前桶的值贡献给答案,但是两个相同的点应该只算一次贡献,我们要再开一个桶来减去重复的次数.

  • 代码:

    int n;
    map<ll,ll> mpx,mpy;
    map<PLL,ll> mp;
    ll x,y;
    ll ans;
     
    int main() {
       // ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
       scanf("%d",&n);
       for(int i=1;i<=n;++i){
          scanf("%d %d",&x,&y);
          ans+=mpx[x]+mpy[y]-mp[make_pair(x,y)];
          mpx[x]++;mpy[y]++;mp[make_pair(x,y)]++; 
       } 
       printf("%lld\n",ans);
        
       return 0;
    }
    
posted @ 2020-11-02 01:34  _Kolibri  阅读(87)  评论(0)    收藏  举报