For a given sequence of numbers a1, a2, ..., an, if we move the first m >= 0 numbers to the end of the seqence, we will obtain another sequence. There are totally n such sequences as the following:
a1, a2, ..., an-1, an (where m = 0 - the initial seqence)
a2, a3, ..., an, a1 (where m = 1)
a3, a4, ..., an, a1, a2 (where m = 2)
...
an, a1, a2, ..., an-1 (where m = n-1)
You are asked to write a program to find the minimum inversion number out of the above sequences.
The input consists of a number of test cases. Each case consists of two lines: the first line contains a positive integer n (n <= 5000); the next line contains a permutation of the n integers from 0 to n-1.
没有看懂为什么要用线段树做tvt
因为数据给得很凑巧(0..n-1),数据也小,就暴力了。
#include <iostream>
using namespace std;
int num[5050];
int main()
{
int n;
while (cin >> n) {
for (int i = 0; i < n; i ++) {
cin >> num[i];
}
int sum = 0;
for (int i = 0; i < n; i ++) {
for (int j = i + 1; j < n; j ++) {
if (num[j] < num[i]) {
sum ++;
}
}
}
int mini = sum;
for (int i = 0; i < n; i ++) {
sum = sum - num[i] + n - 1 - num[i];//当把i从第一个放到最后一个时,逆序数增加(在num[1..n - 1]中)比i大的数的个数,减少比i小的数的个数
mini = min(sum,mini);//因为数从0..n - 1,所以比i大的数有n - 1 - i,比i小的数有i个(0..i - 1),
}
cout << mini << endl;
}
return 0;
}