北京化工大学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;
}
		
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章