博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2828 Buy Tickets(线段树·插队)
阅读量:5787 次
发布时间:2019-06-18

本文共 1384 字,大约阅读时间需要 4 分钟。

题意  n个人排队  每一个人都有个属性值  依次输入n个pos[i]  val[i]  表示第i个人直接插到当前第pos[i]个人后面  他的属性值为val[i]  要求最后依次输出队中各个人的属性值

从头到尾看的话  队列是动态的   无法操作  可是反过来看时  pos[i]就能够表示第i个人前面有多少个空位了  然后想到了用线段树做就简单了  线段树维护相应区间还有多少个空位  每次把i放到前面刚好有pos[i]个空位的位置即可了  详细看代码

#include 
#define lc p<<1, s, mid#define rc p<<1|1, mid+1, e#define mid ((s+e)>>1)using namespace std;const int N = 2e5 + 5;int tot[N * 4], ans[N];//tot维护相应区间还能放多少人int pos[N], val[N];//pos[i] 保存第i个人进队时前面有多少人//val[i] 保存第i个人的valvoid pushup(int p){ tot[p] = tot[p << 1] + tot[p << 1 | 1];}void build(int p, int s, int e){ //tot维护相应区间还能放多少人 if(s == e) { tot[p] = 1; return; } build(lc); build(rc); pushup(p);}//第i个人插入void update(int p, int s, int e, int i){ if(s == e) { tot[p] = 0; ans[e] = val[i]; return; } if(tot[p << 1] > pos[i]) update(lc, i); //左区间的空位足够 else { pos[i] -= tot[p << 1]; update(rc, i); } pushup(p);}int main(){ int n; while(~scanf("%d", &n)) { build(1, 1, n); for(int i = 1; i <= n; ++i) scanf("%d%d", &pos[i], &val[i]); for(int i = n; i > 0; --i) //倒着更新 update(1, 1, n, i); for(int i = 1; i < n; ++i) printf("%d ", ans[i]); printf("%d\n", ans[n]); } return 0;}//Last modified : 2015-07-13 11:13

转载于:https://www.cnblogs.com/gavanwanggw/p/7049901.html

你可能感兴趣的文章
自己写spring boot starter
查看>>
花钱删不完负面消息
查看>>
JBPM之JPdl小叙
查看>>
Membership三步曲之进阶篇 - 深入剖析Provider Model
查看>>
前端优化及相关要点总结
查看>>
struts2中form提交到action中的中文参数乱码问题解决办法(包括取中文路径)
查看>>
25 个精美的手机网站模板
查看>>
C#反射实例应用--------获取程序集信息和通过类名创建类实例
查看>>
VC中实现文字竖排的简单方法
查看>>
会话标识未更新
查看>>
阿里架构师:程序员必须掌握的几项核心技术能力
查看>>
程序员常用的六大技术博客类
查看>>
Iceworks 2.8.0 发布,自定义你的 React 模板
查看>>
胖哥学SpringMVC:请求方式转换过滤器配置
查看>>
Kotlin 更加优雅的 Builder - 理解 with
查看>>
前端日拱一卒D6——字符编码与浏览器解析
查看>>
深入理解浏览器的缓存机制
查看>>
微软向Linux社区开放60000多项专利:对开源微软是认真的
查看>>
Hoshin Kanri在丰田的应用
查看>>
又拍云沈志华:如何打造一款安全的App
查看>>