数组相邻排序最小次数(并查集)

...
5
4 3 2 5 1(用树状数组\(a[i]-n\))
0 0 0 1 1
0 0 1 2 2
0 1 2 3 3
0 1 2 3 4
1 2 3 4 5

#include <iostream>
using namespace std;
int a[200010], p[200010], t[200010], n;
void change(int u){
    for(;u<=n;u+=u&-u)t[u]++;
}
int ask(int u){
    int ans=0;
    for(;u;u-=u&-u)ans+=t[u];
    return ans;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]),p[a[i]]=i;
    int ans=0;
    for(int i=1;i<=n;i++){
        ans+=ask(n)-ask(a[i]);
        change(a[i]);
    }
    printf("%d",ans);
}
posted @ 2021-07-27 00:02  Acception  阅读(67)  评论(0)    收藏  举报