树状数组链接:https://blog.csdn.net/Q_1849805767/article/details/92778639
代码模板:
const int MAX = 1e6 + 7;
int c[MAX];
struct node{
int val, order;
bool operator < (const node &t) const{ // 对 本值 val 排序
return val < t.val;
}
} a[MAX];
int lowbit(int x){
return x & (-x);
}
void add(int i, int num){
while(i < MAX) {
c[i] += num;
i += lowbit(i);
}
}
int Sum(int i){
int sum = 0;
while(i > 0){
sum += c[i];
i -= lowbit(i);
}
return sum;
}
int main() {
int n;
while(~scanf("%d", &n) && n) {
memset(c, 0, sizeof c);
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i].val);
a[i].order = i; // 添加 下标 order
}
sort(a + 1, a + n + 1);
ll ans = 0;
for(int i = 1; i <= n; i++) {
add(a[i].order, 1);
ans += (i - Sum(a[i].order));// 第i个数前有几个i大的数(逆序对)
}
printf("%lld\n", ans);
}
return 0;
}
题目链接:http://poj.org/problem?id=2299 (POJ 2299 Ultra-QuickSort)
题解链接:https://blog.csdn.net/Head_Hard/article/details/79080599