北京化工大學2018年10月程序設計競賽 Problem D

題目描述
我懶得編故事了 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;
}
		
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章