poj Buy Tickets
题目链接:http://poj.org/problem?id=2828
类似的题目:http://www.cnblogs.com/lovychen/p/3674048.html
测试数据:
in:
4
0 77
1 51
1 33
2 69
4
0 20523
1 19243
1 3890
0 31492
out:
77 33 69 51
31492 20523 3890 19243
题目分析:直接倒着进行插入,然后按照从前向后寻找空位进行插入:
【题解】:
线段树节点中保存这一段中的空位数,然后倒序对pos插入:
例如: 0 77
1 51
1 33
2 69
先取: 2 69 —— —— —69— —— (需要前面有3个空位才能插入)
然后取: 1 33 —— —33— —69— —— (需要前面有2个空位才能插入)
然后取: 1 51 —— —33— —69— —51— (需要前面有2个空位才能插入) 前面只有1个空位 故插入后面空格
然后取: 0 77 —77— —33— —69— —51— (需要前面有1个空位才能插入)
AC代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<queue> 6 #include<string> 7 #include<cmath> 8 using namespace std; 9 const int N = 200010; 10 int T,tot; 11 int pre[N],vis[N]; 12 struct TT 13 { 14 int x,y; 15 }a[N]; 16 int lowbit(int x) 17 { 18 return x&(-x); 19 } 20 void init() 21 { 22 for(int i=1;i<=T;i++) 23 vis[i] =lowbit(i); 24 } 25 int sum(int x) 26 { 27 int ans = 0; 28 while(x>0) 29 { 30 ans = ans+vis[x]; 31 x = x-lowbit(x); 32 } 33 return ans; 34 } 35 int update(int x) 36 { 37 while(x<=T) 38 { 39 vis[x] = vis[x] - 1; 40 x = x +lowbit(x); 41 } 42 } 43 void add(int x,int y) 44 { 45 int l=1,r=T,mid; 46 while(l<r) 47 { 48 //printf("l === %d %d %d\n",l,r,mid); 49 mid = (l+r)/2; 50 if(sum(mid)>=x) r = mid; 51 else l = mid+1; 52 } 53 //printf("l = %d\n",l); 54 update(l); 55 pre[l] = y; 56 } 57 int main() 58 { 59 int aa,bb; 60 while(~scanf("%d",&T)) 61 { 62 init(); 63 for(int i=1;i<=T;i++) 64 { 65 scanf("%d %d",&aa,&bb); 66 a[i].x = aa+1; 67 a[i].y = bb; 68 } 69 for(int i=T;i>0;i--) 70 add(a[i].x,a[i].y); 71 for(int i=1;i<=T;i++) 72 { 73 if(i==1) printf("%d",pre[i]); 74 else printf(" %d",pre[i]); 75 } 76 printf("\n"); 77 } 78 return 0; 79 }
poj Buy Tickets相关推荐
- 【POJ】2828 Buy Tickets(线段树+特殊的技巧/splay)
http://poj.org/problem?id=2828 一开始敲了个splay,直接模拟. tle了.. 常数太大.. 好吧,说是用线段树.. 而且思想很拽.. (貌似很久以前写过貌似的,,) ...
- poj 2828 Buy Tickets
http://poj.org/problem?id=2828 题意:在一个队列里,有人依次向第pos个位置插入,求最后的序列: 思路:用线段树存储区间内剩余的没有被占的位置,注意插入的时候要从后向前插 ...
- POJ 2828 Buy Tickets 线段树
题目: http://poj.org/problem?id=2828 很巧妙的题,逆序插入线段树,这样元素不用移动.用二叉排序树也能过. 1 #include <stdio.h> 2 #i ...
- POJ 2828. Buy Tickets
链接 http://poj.org/problem?id=2828 题意 有 NNN 个人排队,每一个人都有一个权值 valvalval ,每一个人都会按顺序插入到当前队伍的某一个位置 posposp ...
- POJ 2828 Buy Tickets | 线段树的喵用
题意: 给你n次插队操作,每次两个数,pos,w,意为在pos后插入一个权值为w的数; 最后输出1~n的权值 题解: 首先可以发现,最后一次插入的位置是准确的位置 所以这个就变成了若干个子问题, 所以 ...
- Buy Tickets(poj 2828)
题意:排队买票,但是 中途 出现插队情况,比如 0 123,代表值为123的人 插入到 0 的位置,如果后面 出现 0 456,那么新的 0的位置就是 456,123就变成是 1的位置了 分析:这道题 ...
- POJ - 2828 Buy Tickets(线段树+思维/Splay+模拟)
题目链接:点击查看 题目大意:给出n个人,一个队列,一开始队列是空的,每个人加入的时候都会插入到指定位置pos的后面,即插队,问最后队列的排列情况是怎么样的 题目分析:一开始很难想到是线段树的题目,毕 ...
- #树状数组#poj 2828 Buy Tickets
题目 输入插队的人和插队的位置,求最终所有人的位置. 分析 树状数组,从后往前(倒推),然后就是要让在前面的次序-1. 代码 #include <cstdio> #include < ...
- POJ 2828Buy Tickets
POJ 2828 题目大意是说有n个插入操作,每次把B插入到位置A,原来A以后的全部往后移动1,球最后的序列 tree里保存的应该是这整个区间还有多扫个位置可以插入数据,那么线段树里从后往前扫描依次插 ...
最新文章
- 题目:[NOIP2008]笨小猴
- python手机端编程环境_移动端自动化测试解决方案(Appium + Python) - (1) 环境搭建...
- vagrant boxes
- Tomcat启动报错整理
- iOS 本地化应用程序汇总 国际化
- Google浏览器截长图 不需要借助任何插件!!!
- 【学习笔记】慕课网—Java设计模式精讲 第3章 软件设计七大原则-3-6 迪米特原则(最少知道原则)...
- ICCV 2019 | 微软开源无监督学习的医学图像配准方法:递归级联网络
- VoltDB培训PPT一则
- select选中值传递到后台action中
- 还在苦恼如何查看微信共同好友吗?用Python轻松搞定
- MATLAB平台文字识别算法实现
- oBlog 4.0 正式版 2006-09-06
- 今日头条安卓_考察今日头条总部—字节跳动
- 测试自己移动速度的软件,Superspeed一键测速脚本 测试服务器到国内电信/联通/移动速度...
- 51、【网工必备】两种常见网络拓扑图介绍,一看就会
- 轻轻松松做演讲的小窍门
- 虚拟化服务器内核数有哪几种,Vmware核心处理器及内核数量相关概念
- 光纤收发器工作原理及技术详解
- java一维数组正序输出,java将一个数组逆序输出-java将一个数组逆序输出的方法-吾爱编程网...
热门文章
- python 斐波那契数列
- git 撤销刚才的rebase_git rebase 的使用 (用于撤销某次commit)
- 随机过程:高斯函数导数、梯度
- 语音识别1: 音频信号采集、并存入 wav文件
- GraphViz:2 DOT语法和相关应用
- java 数组 包含_Java中高效的判断数组中某个元素是否存在详解
- select2 ajax demo,Select2下拉框示例
- @cacheable 是否缓存成功_DNS缓存中毒攻击
- linux ls只显示文件名或者文件夹名
- springmvc如何使用视图解析器_SpringMVC的工作原理