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;
}
posted @ 2025-06-05 09:29  _Yxc  阅读(13)  评论(0)    收藏  举报