给定一个1~n的数列,求出冒泡排序升序排列需要的交换次数
思路:需要用数据结构BIT来进行优化
需要求出数列中每一个数的逆序数,然后求和
每遍历一个值a[ i ],a[ i ]在BIT[ i ]中对应的值及之后的值要加一,记录每个值出现前 小于自身值出现的次数
遍历到j时,a[ j ]前有 j 个数,小于自身的个数有bit[ j ]个
逆序数 = j - bit[ j ]
树状数组能够高效的求出连续一段元素之和或者更新单个元素的值
#include <cstdio>
#include <iostream>
#include <vector>
#include <cmath>
#include <queue>
#include <algorithm>
#include <cstring>
typedef long long ll;
const int maxn = 1e5 + 10;
const int INF = 1e6;
using namespace std;
int n;
int a[maxn];
//BIT
int bit[maxn];
//求和
int Sum(int i){
ll s = 0;
while(i > 0){
s += bit[i];
i -= i & -i;
}
return s;
}
//更新
void Add(int i, int x){
while(i <= n){
bit[i] += x;
i += i & -i;
}
}
void Solve(){
ll ans = 0;
fo