题目链接:http://codeforces.com/problemset/problem/91/B
思路:线段树解决,每个节点存储该段最小的数。。。多简单的二分查找就能解决的问题楞是被我这逗比用线段树做了
这两天在做线段树的题,所以百度了一下codeforces上哪道题是线段树,一个博客说这个是,就做了。看到题后就想着怎么用线段树做,很顺畅的通过。(第一次RE因为数组开小了)
结果做完看到CF上这道题的tags,说是二分查找。。。瞬间觉得自己白痴了,这个题二分查找不是更简单快速吗。。。
泪流满面的贴上线段树的代码:
///2014.6.9
///codeforecs 91B
//Time:124MS
#include <cstdio>
#define lson l , m , rt<<1
#define rson m+1 , r , rt<<1|1
const int maxn = 110000;
int n;
int num[maxn];
int segT[maxn<<2];
void PushUp(int rt){
segT[rt] = segT[rt<<1]<segT[rt<<1|1] ? segT[rt<<1]:segT[rt<<1|1];
}
void build(int l,int r,int rt){
if( l == r ){
scanf("%d",&segT[rt]);
num[l] = segT[rt];
return;
}
int m = (l+r)>>1;
build(lson);
build(rson);
PushUp(rt);
}
int query(int L,int R,int x,int l,int r,int rt){
if( segT[rt]>=x ) return -1;
if( l==r ){
if( segT[rt]<x )
return l;
}
else{
int m = (l+r)>>1;
if( m<R && segT[rt<<1|1] < x )
return query(L,R,x,rson);
else if( L<=m )
return query(L,R,x,lson);
}
return -1;
}
int main(){
// freopen("in","r",stdin);
// freopen("out","w",stdout);
scanf("%d",&n);
build(0,n-1,1);
for(int i=0 ; i<n-1 ; i++){
int r = query(i+1,n-1,num[i],0,n-1,1);
if( r==-1 ) printf("-1 ");
else printf("%d ",(r-i-1) );
}
printf("-1\n");
return 0;
}