zoukankan      html  css  js  c++  java
  • Poj2828Buy Tickets线段树

      倒着搞就可以了,先进会被后面覆盖。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <climits>
    #include <string>
    #include <iostream>
    #include <map>
    #include <cstdlib>
    #include <list>
    #include <set>
    #include <queue>
    #include <stack>
    #include<math.h>
    using namespace std;
    #define lson l,mid,rt<<1
    #define rson mid+1,r,rt<<1|1
    const int maxn=222222;
    int sum[maxn<<2];
    int color[maxn<<2];
    int a[maxn];int b[maxn];
    void up(int rt)
    {
        sum[rt]= sum[rt<<1]+sum[rt<<1|1];
    }
    
    void build(int l,int r,int rt)
    {
        color[rt]=0;
        if(l==r){
            sum[rt]=1; return ;
        }
        int mid=(l+r)>>1;
        build(lson);
        build(rson);
        up(rt);
    }
    
    void update(int ans,int add,int l,int r,int rt)
    {
        if(l==r){
            sum[rt]-=1; color[rt]= add;
            return ;
        }
        int mid=(l+r)>>1;
        if(ans<=sum[rt<<1]) update(ans,add,lson);
        else update(ans-sum[rt<<1],add,rson);
        up(rt);
    }
    
    void ask(int key,int l,int r,int rt)
    {
        if(l==r){
            printf("%d ",color[rt]) ;return ;
        }
        int mid=(l+r)>>1;
        if(key<=mid) ask(key,lson);
        else ask(key,rson);
    }
    
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF){
            build(1,n,1);
            for(int i=0;i<n;i++){
                scanf("%d%d",&a[i],&b[i]);
            }
            for(int i=n-1;i>=0;i--){
                update(a[i]+1,b[i],1,n,1);
            }
            for(int i=1;i<=n;i++)
                ask(i,1,n,1);
            cout<<endl;
        }
        return 0;
    }
  • 相关阅读:
    2012第50周星期日
    2012第51周星期一
    2012第51周星期三
    2012第51周六
    2012第52周一
    2012第51周五冬至
    2012第51周星期二
    2012第52周二
    2012年第51周日
    2012第51周星期四
  • 原文地址:https://www.cnblogs.com/yigexigua/p/3928238.html
Copyright © 2011-2022 走看看