zoukankan      html  css  js  c++  java
  • POJ2828 Buy Tickets

    有N个人排队,每一个人都有一个val来对应,每一个后来人都会插入当前队伍的某一个位置pos。要求把队伍最后的状态输出。

    倒序插入,线段树单点更新,从头到尾输出线段树的状态

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int maxn=2e6+14;
    struct men {
        int pos;
        int val;
    }Men[maxn*4];
    int a[maxn];
    struct node {
        int l;
        int r;
        int sum;
    }segTree[maxn*4]; 
    void build (int i,int l,int r) {
        segTree[i].l=l;
        segTree[i].r=r;
        segTree[i].sum=0;
        if (l==r) return;
        int mid=(segTree[i].l+segTree[i].r)>>1;
        build(i<<1,l,mid);
        build(i<<1|1,mid+1,r);
    }
    void add (int i,int k,int val) {
        if (segTree[i].l==segTree[i].r) {
            segTree[i].sum++;
            a[segTree[i].l]=val;
            return;
        }
        int mid=(segTree[i].l+segTree[i].r)>>1;
        int tmp=mid-segTree[i].l+1-segTree[i<<1].sum;
        if (tmp>k) add(i<<1,k,val);
        else add(i<<1|1,k-tmp,val);
        segTree[i].sum=segTree[i<<1].sum+segTree[i<<1|1].sum;
    }
    int main () {
        int n;
        while (~scanf("%d",&n)) {
            build(1,1,n);
            for (int i=1;i<=n;i++) {
                scanf ("%d %d",&Men[i].pos,&Men[i].val);
            }
            for (int i=n;i>=1;i--) {
                add(1,Men[i].pos,Men[i].val);
            }
            for (int i=1;i<=n;i++) {
                if (i!=1) printf (" ");
                printf ("%d",a[i]);
            }
            printf ("
    ");
        }
        return 0;
    }
  • 相关阅读:
    AC自动机 [模板]
    ChonSu [ZOJ 2684]
    Quad Tiling [POJ 3420]
    LCA 最近公共祖先 [POJ 1330]
    强连通分量[trajan]
    高斯消元 [模板]
    01K Code [HDU 1545]
    Cycle Game [ZOJ 2686]
    清除Eclipse中的内置浏览器中的历史记录(REF)
    第三方的 NET 数据库连接提供者,Lightswitch
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/12323031.html
Copyright © 2011-2022 走看看