题意:给定一个数列,求对每一个数求后面有多少个数比这个小。
题解:用a[n]存储数列,用d[n]表示数字n是否存在(存在为1否则为0),然后倒序插入,求当前已经插入的有多少个比他小即可。
代码:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
using namespace std;
const int maxn = 1e5+5;
map<int,int > mp;
int d[maxn],a[maxn],b[maxn];
int n;
int lowbit(int x){
return x&(-x);
}
void add(int x){
while(x<=n){
d[x]+=1;
x+=lowbit(x);
}
}
int getsum(int x){
int res=0;
while(x){
res+=d[x];
x-=lowbit(x);
}
return res;
}
int res[maxn];
int main()
{
scanf("%d",&n);
int i;
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(i=1;i<=n;i++)b[i]=a[i];
sort(a+1,a+n+1);
for(i=1;i<=n;i++)mp[a[i]]=i;
for(i=1;i<=n;i++)b[i]=mp[b[i]];
for(i=n;i>=1;i--){
add(b[i]);
res[i]=getsum(b[i]);
//printf("%d ",getsum(b[i]));
}
for(i=1;i<=n;i++){
printf("%d",res[i]-1);
if(i==n)printf("\n");
else printf(" ");
}
//cout << "Hello world!" << endl;
return 0;
}