我们用一个sum数组表示位置i有没有空位即能不能插进来一个人,sum【i】 = 1代表这个位置上能插进来一个人,sum = 0表示不能插入; 以poj2828的第一组样例为例: 注意sum下标从0开始 sum:1 1 1 1 1表示5个位置上都可以插入,如果我们把(2,69)插入: sum:1 1 0 1 1那么肯定第三个位置上的数字是69;...
【POJ2828】Buy Tickets(线段树) 题意:有一个输入序列,每次操作要把b[i]插入到第a[i]个,在第a[i]个后面的要后移,问最后序列。 n<=200000 思路:顺序来只能用splay维护 考虑倒序,对于插入到第K个位置,在线段树二分第K个0的位置,类似于主席树 将其插入后将这个位置修改为已经有数 单点修改 1vart:array...
}tr[N<<2];intans[N];voidpushup(intu){ tr[u].size=tr[u<<1].size+tr[u<<1|1].size; }voidbuild(intu,intl,intr){if(l==r){ tr[u]={l,r,1}; }else{ tr[u]={l,r};intmid=l+r>>1; build(u<<1,l,mid); build(u<<1|1,mid+1,r); pushup(u); } }voidmodify(int...
poj2828 Buy Tickets——倒序处理 http://poj.org/problem?id=2828 这题可以倒序来做,因为越靠后的人实际上优先级越高; 用0和1表示这个位置上是否已经有人,0表示有,1表示没有,这样树状数组维护前缀和表示这个位置前面有多少个空位置; 每插入一个人,找到前面空位置恰好是他要求的个数的那个位置,就是他最终站...
POJ 2828 经典 逆推即可 ★★★ /* 题意:一些人,相继插入到pos[i]之后 问最后的情形 解题报告: 本题的算法是利用线段树进行倒推。基本思想是拿一个N个1的序列,从最后一次插入开始倒推。 设当前插入的是Pos Val,那么找到从左边数第Pos + 1个1的位置就是最终需要插入Val的位置,...
POJ-2828-Buy Tickets http://poj.org/problem?id=2828 线段树,逆序插入 #include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>using namespace std;#define N 200010struct cam{ int x,y; int num;}list[N*8];int pos[N],value[N],ans[N];int n;void build(int k,int x,int y...
POJ 2828 单点更新 题意:给出N个人要查入队伍中的位置,按照输入的顺序,求最后队伍的先后顺序。 先把输入存起来,从后往前插入,前一个序号就代表前面有几个人,线段树内记录当前位置是否被占了,找低Num+1个空位坐下就行,查询函数返回空总和为num+1的位置。
POJ 2828 Buy Tickets(神题!线段树or树状数组) 2014-05-16 12:27 −... Rayn 0 202 BUY LOW, BUY LOWER, POJ - 1952(LIS+去重计数) 2019-12-11 21:15 −一开始疯狂WA,后来用别人题解代码debug发现 2 1 1 这组数据应该输出1,而我输出0,原来是ans初始化错了。。。 解析: 我去重的思想是,如果...
poj2828 Buy Tickets 。要求把队伍最后的状态输出。 逆向思考。这样考虑,最后一个人一定会得到当前队伍他想要的位置,如果我们往前一个阶段,倒数第二个人也一定能得到他想要的位置……,也就是说,我们可以这样处理,我们把最后一个人插入,然后忽略它,再把倒数第二个人插入。即,我们找出当前队伍他想要插入的位置pos的...
题目链接:http://poj.org/problem?id=2828 题意就是给你n个人,然后每个人按顺序插队,问你最终的顺序是怎么样的。 反过来做就很容易了,从最后一个人开始推,最后一个人位置很容易就确定了,那最后第二个人的位置也可以推(与最后一个人的位置无关)...依次就都可以确定所有的人了。