poj2828

来源:互联网 发布:邮箱营销软件 编辑:程序博客网 时间:2024/05/13 14:36

链接:点击打开链接

题意:就是后面人插队的问题,具体如图所示

代码:

#include <iostream>#include <stdio.h>#include <string.h>using namespace std;int node[200000*3],ans[200000];int x[200000],y[200000];void build(int pos,int l,int r,int id,int x){    int mid;    if(l==r){        node[pos]=1;                              //初始时最下空格都为1        return;    }    mid=(l+r)/2;    if(id<=mid)    build(2*pos,l,mid,id,x);    else    build(2*pos+1,mid+1,r,id,x);    node[pos]=node[2*pos]+node[2*pos+1];           //更新区间中空格数}void question(int pos,int l,int r,int num,int x){    int mid;    if(l==r){        ans[l]=x;node[pos]=0;                       //放入一个数,空格数就清零        return;    }    mid=(l+r)/2;    if(num<=node[2*pos])    question(2*pos,l,mid,num,x);    else    question(2*pos+1,mid+1,r,num-node[2*pos],x);    node[pos]=node[2*pos]+node[2*pos+1];            //向上更新    }int main(){    int i,n;    while(scanf("%d",&n)!=EOF){        memset(ans,0,sizeof(ans));        for(i=1;i<=n;i++){        scanf("%d%d",&x[i],&y[i]);        build(1,1,n,i,y[i]);        }        for(i=n;i>=1;i--)                           //因为后面的数决定了前面        question(1,1,n,x[i]+1,y[i]);                //的数的位置,所以从后面更新        for(i=1;i<=n;i++)        printf("%d ",ans[i]);        printf("\n");    }    return 0;}


 

0 0