2828 Buy Tickets

来源:互联网 发布:八大山人 知乎 编辑:程序博客网 时间:2024/05/22 03:30

考思维的一题,从后往前更新,线段树维护所剩余的空位置。线段树还真是需要灵活运用...因为知道是线段树的题,一开始直接暴力更新,TLE,然后...discuss...太不给力了发火

代码如下:

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))#define INF 1000000000#define N 200000#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1int tree[N<<2];int val[N],pos[N],ans[N];int id;void build(int l,int r,int rt){    tree[rt]=r-l+1;    if(l==r)return;    int m=(l+r)>>1;    build(lson);    build(rson);}void update(int p,int l,int r,int rt){    tree[rt]--;    if(l==r)    {        id=l;        return;    }    int m=(l+r)>>1;    if(tree[rt<<1]>=p)update(p,lson);    else    {        p-=tree[rt<<1];        update(p,rson);    }}int main(){    int n;    while(~scanf("%d",&n))    {        build(1,n,1);        for(int i=1;i<=n;i++)        {            scanf("%d%d",&pos[i],&val[i]);        }        for(int i=n;i>=1;i--)        {            update(pos[i]+1,1,n,1);            ans[id]=val[i];        }        for(int i=1;i<=n;i++)        {            printf("%d ",ans[i]);        }        printf("\n");    }    return 0;}

原创粉丝点击