树状数组求逆序对

贴个板子

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxx=1e6+10;
const int INF=1e9;
const int MOD=1e9+7;
int n;
int a[maxx];
int sum[maxx];
void add(int x,int b)
{
    for(int i=x; i<=n; i+= i&(-i)){
        sum[i]+=b;
    }
}
int ask(int x)
{
    int ret=0;
    for(int i=x; i>0; i-= i&(-i)){
        ret+=sum[i];
    }
    return ret;
}
int main()
{
    cin>>n;
    for(int i=1; i<=n; i++){
        cin>>a[i];
    }
    int ans=0;
    for(int i=1; i<=n; i++){
        add(a[i],1);
        ans+= i-ask(a[i]);
    }
    cout<<ans<<endl;
    return 0;
}

加数据离散化

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxx=1e6+10;
const int INF=1e9;
const int MOD=1e9+7;
struct node
{
    int a,p;
}s[maxx];
int n;
int b[maxx];
bool cmp(node x,node y)
{
    if(x.a==y.a)  return x.p<y.p;
    return x.a<y.a;
}
int sum[maxx];
void add(int x,int b)
{
    for(int i=x; i<=n; i+= i&(-i)){
        sum[i]+=b;
    }
}
int ask(int x)
{
    int ret=0;
    for(int i=x; i>0; i-= i&(-i)){
        ret+=sum[i];
    }
    return ret;
}
int main()
{
    cin>>n;
    for(int i=1; i<=n; i++){
        cin>>s[i].a;
        s[i].p=i;
    }
    sort(s+1,s+n+1,cmp);
    for(int i=1; i<=n; i++)
        b[s[i].p]=i;
    int ans=0;
    for(int i=1; i<=n; i++){
        add(b[i],1);
        ans+= i-ask(b[i]);
    }
    cout<<ans<<endl;
    return 0;
}

 

posted @ 2018-07-25 16:40  任小喵  阅读(107)  评论(0编辑  收藏  举报