题解:SP4226 MSE06H - Japan

解题思路

先可以看一个特例。

如图:

得出结论两条路相交的条件为 \(x_i<x_j\)\(y_j < y_i\)

发现如果按第一个数排序,只有第二个数成逆序对的两条路才会相交,所以直接按第一个数排序后求逆序对数量即可。

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1010;

int n, m, k;
struct node {
    int x, y;
} a[N * N];
int b[N * N];

int lowbit(int x) {
    return x & -x;
}

void add(int x, int val) {
    for (int i = x; i <= m; i += lowbit(i)) b[i] += val;
}

int sum(int x) {
    int res = 0;
    for (int i = x; i > 0; i -= lowbit(i)) res += b[i];
    return res;
}

void Solve(int T) {
    memset(b, 0, sizeof b);
    cin >> n >> m >> k;
    for (int i = 1; i <= k; i ++ ) cin >> a[i].x >> a[i].y;
    sort(a + 1, a + k + 1, [](node a, node b){return (a.x == b.x? a.y < b.y : a.x < b.x);});
    int res = 0;
    for (int i = k; i >= 1; i -- ) {
        res += sum(a[i].y - 1);
        add(a[i].y, 1);
    }
    printf("Test case %lld: %lld\n", T, res);
}

signed main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int T, cnt = 0;
    cin >> T;
    while (T -- ) Solve( ++ cnt);
    return 0;
}
posted @ 2025-01-20 17:05  zla_2012  阅读(14)  评论(0)    收藏  举报