poj2828~线段树倒推

来源:互联网 发布:怎么查看淘宝开店时间 编辑:程序博客网 时间:2024/06/05 04:59

一开始看到别人说用线段树做,看了题目,没一点想法,借鉴前人的思想,才想到用倒推来做,很基础的点更新,想清楚了就简单,不然还是蛮纠结的。


ACcode:

#include<stdio.h>#include<string.h>#include<iostream>using namespace std;const int size=200000;int add[size+10][2];int sum[size<<2],res[size+10];void pushup(int rt){     sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void build(int rt,int l,int r){     if (l==r)     {        sum[rt]=1;        return ;     }          int mid=(l+r)>>1;     build(rt<<1,l,mid);     build(rt<<1|1,mid+1,r);     pushup(rt);}void update(int rt,int l,int r,int p,int v){     if (l==r)     {        sum[rt]=0;        res[l]=v;        return ;     }     int mid=(l+r)>>1;     if (p<sum[rt<<1]) update(rt<<1,l,mid,p,v);     else update(rt<<1|1,mid+1,r,p-sum[rt<<1],v);     pushup(rt);}int main(){    int i,n;    while (~scanf("%d",&n))    {          build(1,1,n);          for (i=1;i<=n;i++) scanf("%d %d",&add[i][0],&add[i][1]);          for (i=n;i>0;i--) update(1,1,n,add[i][0],add[i][1]);          for (i=1;i<n;i++) printf("%d ",res[i]);          printf("%d\n",res[i]);    }    return 0;}