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; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮

浙公网安备 33010602011771号