A. Watchmen
https://codeforces.com/problemset/problem/650/A
题意:给定平面上n个坐标,问曼哈顿距离跟欧式距离相等的有序对有多少个。
思路:先考虑x方向相等的所有有序对数量,再考虑y方向相等的所有有序对数量,最后,再减去x和y方向都相等的有序对数量,就是最终的结果。
总结:目前是对所有的数据做了一个重映射再存起来的,还有个方法很久没用了,是先存所有的数,然后排序再去重,但是这样最后做统计的时候,不太好确定范围,还是要遍历每个数才可以,得用个set把所有的数存起来,遍历set,然后再直接遍历红黑树找有序对数量。
inline void solve() {
int n;
cin >> n;
map<int, int> left, right;
map<pair<int, int>, int> pairs;
vector<pair<int, int>> a(n);
map<int, int> numMap;
for (int i = 0; i < n; ++i) {
int x, y;
cin >> x >> y;
if (!numMap.count(x)) {
int g = numMap.size();
numMap[x] = g;
}
if (!numMap.count(y)) {
int g = numMap.size();
numMap[y] = g;
}
a[i] = {numMap[x], numMap[y]};
}
int m = 0;
for (int i = 0; i < n; ++i) {
auto& [x, y] = a[i];
left[x] ++;
right[y] ++;
pairs[{x, y}] ++;
m = max({m, x, y});
}
long long ans = 0;
for (int i = 0; i <= m; ++i) {
ans += 1ll * left[i] * (left[i] - 1) / 2;
ans += 1ll * right[i] * (right[i] - 1) / 2;
}
for (auto [pos, cnt] : pairs) {
ans -= 1ll * cnt * (cnt - 1) / 2;
}
cout << ans << endl;
}

浙公网安备 33010602011771号