题目比较绕,但是大意就是求逆序对(帮牛们解开缠绕在一起的绳子),此题允许O(n2),但是nlogn就可以过。
主要就是如何得到要排序的序列,main函数里可以清晰看出来。
下面是代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#define M 1001
using namespace std;
int n, a[M], xu[M], b[M] ;
int msort( int s[], int a, int b )
{
if ( a>=b ) return 0;
int m = (a+b)>>1, r = msort(s,a,m)+msort(s,m+1,b), i = a, j = m+1, k;
static int t[M];
for ( k = a; k <= b; k++ )
if ( j>b || (i<=m && s[i]<=s[j])) { t[k] = s[i++]; r += j-m-1; }
else t[k] = s[j++];
memcpy(s+a,t+a,sizeof(*s)*(b-a+1));
return r;
}
int main()
{
int i, j, k;
cin >> n;
for ( i = 0; i < n; i++ )
{
scanf( "%d%d", &j, &k);
xu[k] = i; b[i] = j;
}
for ( i = 0; i < n; i++ )
a[i] = xu[b[i]];
k = msort(a,0,n-1);
cout << k << endl;
}