**题目意思:有n个数,进行n次操作,每次操作有两个数pos, ans。pos的意思是把ans放到第pos 位置的后面,pos后面的数就往后推一位。最后输出每个位置的ans。
**
这个线段树还是挺好的题目。。
也想到了反过来,但是觉得一个一个去找就不可以了,,
所以这个地方就用到了线段树。。
int n;
int p[N],val[N];
int ans[N],sum[N<<2],tl[N<<2],tr[N<<2];
void build(int ll,int rr,int i){
tr[i]=rr;tl[i]=ll;
if(ll==rr){ sum[i]=1;return ; }
build(ll,md,ls),build(md+1,rr,rs);
sum[i]=sum[ls]+sum[rs];
}
void update(int p,int i){
if(tl[i]==p&&tr[i]==p){ sum[i]=0;return; }
int mid=(tr[i]+tl[i])>>1;
if(p<=mid)update(p,ls);
else update(p,rs);
sum[i]=sum[ls]+sum[rs];
}
int query(int k,int ll,int rr,int i){
if(tl[i]==tr[i])return tl[i];
if(sum[ls]>=k)return query(k,ll,md,ls);
return query(k-sum[ls],md+1,rr,rs);
}
int main(){
while(~sf("%d",&n)){
rep(i,1,n)sf("%d%d",&p[i],&val[i]);
build(1,n,1);
for(int i=n;i>=1;--i){
int t=query(p[i]+1,1,n,1);
ans[t]=val[i];
update(t,1);
}
rep(i,1,n)pf("%d%c",ans[i],i==n?'\n':' ');
}
}
本文解析了一道关于线段树的应用题,该题需要在一系列操作中维护一个动态数组的状态,并通过线段树实现高效的插入和查询。文章详细介绍了线段树的数据结构及其构建、更新和查询操作。
863

被折叠的 条评论
为什么被折叠?



