考察点:树状数组求逆序数
其离散化过程如下
6
24 35 12 01 56 231 2 3 4 5 6
4 3 6 1 2 5
*4 5 2 1 6 3
*3 3 1 0 1 0
#include <bits/stdc++.h>
using namespace std;
const int sz=100000+1024;
int val[sz],n,res[sz],A[sz];
void update(int i)
{
while(i<=n){
val[i]++;
i+=-i&i;
}
}
int getsum(int i)
{
int sum=0;
while(i>=1){
sum+=val[i];
i-=-i&i;
}
return sum;
}
int main()
{
// freopen("1.txt","r",stdin);
scanf("%d",&n);
typedef pair<int,int> ele;
vector<ele> v(n+1);
for(int i=1;i<=n;++i){
scanf("%d",&v[i].first);
v[i].second=i;
}
sort(v.begin()+1,v.end());//从小到大排列
for(int i=1;i<=n;++i){
A[v[i].second]=i;
}
for(int i=n;i>=1;--i){
res[i]=getsum(A[i]);
update(A[i]);
}
for(int i=1;i<=n;++i){
i==n?printf("%d",res[i]):printf("%d ",res[i]);
}
return 0;
}