題目描述
我懶得編故事了 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;
}