poj 2828 Buy Tickets(动态队列·线段树单点更新)

2024-03-27 23:38

本文主要是介绍poj 2828 Buy Tickets(动态队列·线段树单点更新),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

大意:一群人排队,第i个人来到队伍中站到处于posi的人的右边,且每个人都有不同的表示值,问最终的结果?

Sample Input

4
0 77
1 51
1 33
2 69
4
0 20523
1 19243
1 3890
0 31492

Sample Output

77 33 69 51
31492 20523 3890 19243

Hint

The figure below shows how the Little Cat found out the final order of people in the queue described in the first test case of the sample input.



能力低,感觉自己还得好好加油啊。。初读这题,感觉很厉害的样子,果然,想了很久还是没得到结果。参考了大神们的思路,总算有点头绪了。正确排序的关键是后来的有位置上的优先权:所以从后向前输入,用一颗二叉树的叶子节点来放各个点。pos决定初始位置,在二叉树中寻找叶子节点即可,如果pos没有空余的位置了就向后放(右子树)。起初我怀疑过这种方法,比如:
考虑从后往前输入,第一个例子:
0 0 69 0
0 33 69 0
0 33 69 51
77 33 69 51
但是第二个例子:
31492  0 0 0
31492 3890 0 0 
31492 3890 19243 0
31492 3890 19243 20523
这不是和结果不符吗?但还好可以进一步用pos和num的关系来决定位置,详见代码:
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=2e5+5;
int ans[maxn];
struct node{int l,r,num;int mid(){  return (l+r)/2; }
}tree[maxn<<2];
void build(int root,int low,int high){tree[root].l=low;tree[root].r=high;if(low==high){tree[root].num=1;return ;}int m=tree[root].mid();build(2*root,low,m);  //no if elsebuild(2*root+1,m+1,high);tree[root].num=tree[2*root].num+tree[2*root+1].num;
}
void insert(int root,int p,int val){if(tree[root].l==tree[root].r){//cout<<tree[root].l<<endl;tree[root].num=0;ans[tree[root].l]=val;return ;}if(p<=tree[2*root].num)insert(2*root,p,val);else  {p=p-tree[2*root].num;  //pos有一个作用:测试num,pos-num变成右子树的测试numinsert(2*root+1,p,val); //eg.p=3,left_num=1,for right_tree: p=2}  //if p=3,left_tree is full,left_num=0, find suitable place in right_tree.tree[root].num=tree[2*root].num+tree[2*root+1].num;
}
struct tnode{int pos,val;
}tp[maxn];
int main()
{//freopen("cin.txt","r",stdin);int n;while(cin>>n){build(1,1,n);for(int i=0;i<n;i++){scanf("%d%d",&tp[i].pos,&tp[i].val);}//for(int i=7;i>=1;i--)cout<<tree[i].num<<" ";  cout<<endl;for(int i=n-1;i>=0;i--){insert(1,tp[i].pos+1,tp[i].val);}//for(int i=7;i>=1;i--)cout<<tree[i].num<<" ";  cout<<endl;for(int i=1;i<n;i++){printf("%d ",ans[i]);}printf("%d\n",ans[n]);}return 0;
}

这篇关于poj 2828 Buy Tickets(动态队列·线段树单点更新)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/853786

相关文章

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

Linux Mint Xia 22.1重磅发布: 重要更新一览

《LinuxMintXia22.1重磅发布:重要更新一览》Beta版LinuxMint“Xia”22.1发布,新版本基于Ubuntu24.04,内核版本为Linux6.8,这... linux Mint 22.1「Xia」正式发布啦!这次更新带来了诸多优化和改进,进一步巩固了 Mint 在 Linux 桌面

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Ubuntu 24.04 LTS怎么关闭 Ubuntu Pro 更新提示弹窗?

《Ubuntu24.04LTS怎么关闭UbuntuPro更新提示弹窗?》Ubuntu每次开机都会弹窗提示安全更新,设置里最多只能取消自动下载,自动更新,但无法做到直接让自动更新的弹窗不出现,... 如果你正在使用 Ubuntu 24.04 LTS,可能会注意到——在使用「软件更新器」或运行 APT 命令时,

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指