题目描述:
给一个数组,算inverted pair的数目
输入:
有多组测试样例。每组输入数据占一行,每一行是一个数组,数组之间的元素用空格分开
输出:
每组输出结果占一行。对应于每组输入数据的inversions
样例输入:
1 2 3
2 1 3
3 2 1
样例输出:
0
1
3
实现代码:
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#define lowbit(i) ((i)&(-i))
const int maxn = 1000;
int n;
int c[maxn];
int A[maxn];
void update(int x, int v,int maxNum) {
for(int i = x; i <= maxNum; i += lowbit(i)) {
c[i] += v;
}
}
int getSum(int x) {
int sum = 0;
for(int i = x; i > 0; i -= lowbit(i)) {
sum += c[i];
}
return sum;
}
int strToNum(string s, int &maxNum) {
int num = 0;
int temp = 0;
for(int i = 0; i < s.size(); i++) {
if(s[i] >= '0' && s[i] <= '9') {
temp = temp * 10 + s[i] - '0';
} else {
A[num++] = temp;
if(maxNum < temp) {
maxNum = temp;
}
temp = 0;
}
}
A[num++] = temp;
if(maxNum < temp) {
maxNum = temp;
}
return num;
}
int main() {
string s;
while(getline(cin, s)) {
memset(c, 0, sizeof(c));
memset(A, 0, sizeof(A));
int maxNum = 0;
int num = strToNum(s, maxNum);
long long sum = 0;
for(int i = 0; i < num; i++) {
update(A[i], 1,maxNum);
sum += getSum(maxNum) - getSum(A[i]);
}
printf("%lld\n", sum);
}
return 0;
}