题目链接:http://poj.org/problem?id=2828

题意就是有n个x y每次都是把y放到x位置,如果x位置有数,则把该位置之后的数往后放一位;

【题解】:

    线段树节点中保存这一段中的空位数,然后倒序对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个空位才能插入)

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 200010
#define Lson r<<1
#define Rson r<<1|1
using namespace std; struct SegTree
{
int L, R, sum;
int mid()
{
return (L+R)/;
}
}a[*N]; struct node
{
int x, y;
}b[N];
int ans[N];
void BuildTree(int r, int L, int R)
{
a[r].L = L;
a[r].R = R;
a[r].sum = R-L+;
if(L==R)
return;
BuildTree(Lson, L, a[r].mid());
BuildTree(Rson, a[r].mid()+, R);
}
int Update(int x, int r)
{
a[r].sum--;
if(a[r].L == a[r].R)
return a[r].L;///返回插入位置;
if(a[Lson].sum >= x)
return Update(x, Lson);
else
{
x-=a[Lson].sum;///当左边的空格小于x,则插入右边,插入右边位置x应该减左边的空格数
return Update(x, Rson);
}
}
int main()
{
int n;
while(scanf("%d", &n)!=EOF)
{
for(int i=; i<n; i++)
scanf("%d%d", &b[i].x, &b[i].y);
BuildTree(, , n);
for(int i=n-; i>=; i--)
{
int id = Update(b[i].x+, );
ans[id] = b[i].y;
}
for(int i=; i<n; i++)
printf("%d ", ans[i]);
printf("%d\n", ans[n]);
}
return ;
}

Buy Tickets---poj2828(线段树)的更多相关文章

  1. POJ2828 Buy Tickets 【线段树】+【单点更新】+【逆序】

    Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 12296   Accepted: 6071 Desc ...

  2. poj-2828 Buy Tickets(线段树,排队问题,逆向思维)

    题目地址:POJ 2828 Buy Tickets Description Railway tickets were difficult to buy around the Lunar New Yea ...

  3. 【POJ2828】Buy Tickets(线段树)

    题意:有一个输入序列,每次操作要把b[i]插入到第a[i]个,在第a[i]个后面的要后移,问最后序列. n<=200000 思路:顺序来只能用splay维护 考虑倒序,对于插入到第K个位置,在线 ...

  4. poj-2828 Buy Tickets(经典线段树)

    /* Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 10207 Accepted: 4919 Descr ...

  5. POJ2828 Buy Tickets(线段树之插队问题)

    飞翔 问题是这样的:现在有n个人要买票,但是天黑可以随便插队.依次给出将要买票的n个人的数据信息.包含两项:pos,当前第i号人来了之后他肯定要插入到pos这个位置,如果当前pos无人,那最好了,直接 ...

  6. POJ 2828 Buy Tickets(线段树 树状数组/单点更新)

    题目链接: 传送门 Buy Tickets Time Limit: 4000MS     Memory Limit: 65536K Description Railway tickets were d ...

  7. 【POJ】2828 Buy Tickets(线段树+特殊的技巧/splay)

    http://poj.org/problem?id=2828 一开始敲了个splay,直接模拟. tle了.. 常数太大.. 好吧,说是用线段树.. 而且思想很拽.. (貌似很久以前写过貌似的,,) ...

  8. poj 2828 buy Tickets 用线段树模拟带插入的队列

    Buy Tickets Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2 ...

  9. Buy Tickets(线段树单点更新,逆向思维)

    题目大意:有n个的排队,每一个人都有一个val来对应,每一个后来人都会插入当前队伍的某一个位置pos.要求把队伍最后的状态输出. 个人心得:哈哈,用链表写了下,果不其然超时了,后面转念一想要用静态数组 ...

  10. poj 2828 Buy Tickets 【线段树点更新】

    题目:id=2828" target="_blank">poj 2828 Buy Tickets 题意:有n个人排队,每一个人有一个价值和要插的位置,然后当要插的位 ...

随机推荐

  1. 使用_snscanf_s转换十六进制时引起的内存越界

    //将Hex编码转换为指定编码格式的字符串 string Encoding::DecodeHexString(const string &strSrc, UINT code_page ) { ...

  2. CentOS安装emacs24.2命令

    CentOS安装emacs24.2命令 #1.安装如下软件 yum -y groupinstall "Development Tools" yum -y install gtk+- ...

  3. asp.net管线

  4. 记js的一个奇葩问题!!!!!!!!!!!!

    <a id='gc-yl' onclick='Preview('" + imgPath + "')' style='margin-left:5px;' >预览</ ...

  5. vs2008 调试时不会命中断点,源代码与原始版本不同,解决办法

    当前不会命中断点,源代码与原始版本不同,解决办法 1.应该是自己一行里写的代码太长了 格式化一下 或者 换下行 2. VC直接把整个文件格式化了一次,断点就可以用了 菜单:编辑-〉高级-〉设置选定内容 ...

  6. 【matlab】使用VideoReader提取视频的每一帧,不能用aviread函数~

    这个问题是matlab版本问题,已经不用aviread函数了~ VideoReader里面没有cdata这个函数! MATLAB不支持avireader了,而且没有cdata这个属性了,详情去官网ht ...

  7. [转]ASP.NET MVC 5 - 添加一个模型

    在本节中,您将添加一些类,这些类用于管理数据库中的电影.这些类是ASP.NET MVC 应用程序中的"模型(Model)". 您将使用.NET Framework 数据访问技术En ...

  8. Git 的BUG小结

    Git 的BUG小结 Git 在push的时候出现了: fatal: The remote end hung up unexpectedly 在网上找了非常多  发现出现了下面错误提示也可能是同样的问 ...

  9. window 后台执行 redis(隐藏窗口)

    方法是在知乎上看的,链接:https://www.zhihu.com/question/22771030 实现方法是利用一个vbe脚本去运行一个bat脚本,在bat脚本里启动exe软件 PS:要想启动 ...

  10. linux 提示符>怎样退出

    在linux(Red Hat)字符界面下,不小心输入了上漂号 ’ ,结果命令提示符变成了>,然后在q.exit.ctrl+c.ctrl+z都回不去了,不知道怎么回到#的命令提示符?   表示ct ...