树状数组求逆序对
贴个板子
#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;
}