首先把边按照e这边排序,然后求w那边的逆序数就可以了.
注意要用long long存结果.
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 590;
struct line{
int e,w;
bool operator<(const line & rhs)const{
return e < rhs.e || (e == rhs. e && w < rhs.w);
}
}lines[maxn *maxn], temp[maxn * maxn];
int k;
long long ans;
void mergeSort(int l, int r){
if(l >= r)return;
int m = (l + r) >> 1;
mergeSort(l, m), mergeSort(m + 1, r);
int i = l, j = m + 1, p = l;
while (i <= m && j <= r){
if(lines[i].w > lines[j].w){
ans += m - i + 1;
temp[p++] = lines[j++];
}else{
temp[p++] = lines[i++];
}
}
while(i <= m) temp[p++] = lines[i++];
while(j <= r) temp[p++] = lines[j++];
while(l <= r) lines[l] = temp[l++];
}
int main(){
int ts, t1, t2, cas = 1;
scanf("%d", &ts);
while (ts--){
scanf("%d %d %d", &t1, &t2, &k);
for (int i = 0; i < k; ++i){
scanf("%d %d", &lines[i].e, &lines[i].w);
}
sort(lines, lines + k);
ans = 0;
mergeSort(0, k - 1);
printf("Test case %d: %lld\n", cas++, ans);
}
return 0;
}