题目描述
我懒得编故事了 m哥牛逼!
有n个积木,第i个积木的高度为a[i],求每个积木前面有几个比它矮的积木
输入
多组输入,每组由两行组成,第一行输入n,第二行输入n个数,为n个积木的高度a[i]
//(1<=n<=100000)(1<=a[i]<=1000000000)
输出每组数据输出n个数,第i个数为第i个积木前面比他矮的积木的个数
样例输入
5
1 2 3 4 5
样例输出
0 1 2 3 4
这道题我是看着题解写的,但是好像有点问题啊,这样写的话,要是输入不是按照从小到大的顺序来就会出错啊,输入5 4 3 2 1就会无法输出。
#include<stdio.h>
#include<string>
#include<string.h>
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=100005;
int n;
int a[maxn],b[maxn],c[maxn],ans[maxn];
int lowbit(int x)
{
return x&(-x);
}
int sum(int x)//求出x对应的值
{
int ret=0;
for(int i=x;i>1;i-=lowbit(i))
{
ret+=c[i];
}
return ret;
}
void add(int x,int y)//从底部往上更改值(即找x前面有几个数)
{
for(int i=x;i<=n;i+=lowbit(i))
{
c[i]+=y;
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(c,0,sizeof(c));
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+n+1);
int cnt=unique(b+1,b+n+1)-(b+1);//对数组b进行离散化,即去重
for(int i=1;i<=n;i++)
{
int pos=lower_bound(b+1,b+n+1,a[i])-b;
//printf("pos = %d\n",pos);
ans[i]=sum(pos);
//printf("ans[%d] = %d\n",i,ans[i]);
printf("%d%c",ans[i],i==n?'\n':' ');
add(pos+1,1);
}
}
return 0;
}