给定n(n<=100000)个正整数,希望对其从小到大排序,如果采用冒泡排序算法,请计算需要进行的交换次数
分析:单点更新,更新过程中求区域和
注意数据范围,开long long
#include<iostream>
using namespace std;
#define ll long long
ll c[100005];
int N;
int lowbit(int n) {
return n & (-n);
}
void update(ll c[], int i, int val) {
while (i <= N) {
c[i] += val;
i += lowbit(i);
}
}
ll sum(ll c[], int i) {
ll res = 0;
while (i) {
res += c[i];
i -= lowbit(i);
}
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
while (cin >> N) {
for (int i = 1; i <= N; ++i) {
c[i] = 0;
}
ll res = 0;
for (int i = 1; i <= N; ++i) {
int idx;
cin >> idx;
update(c, idx, 1);
res += sum(c, N) - sum(c, idx);
}
cout << res << "\n";
}
return 0;
}