POJ 2828.Buy Tickets-完全版线段树(单点更新、逆序遍历查询)
POJ2828.Buy Tickets
这个题是插队问题,每次有人插队的时候,其后的所有数据都要进行更新,如果我们反着推,就可以把所有的数据都安排好并且不用再对已插入的数据进行更新,因为逆序处理的话所有的位置都是确定的,第i个人插进来,这个人前面一定有i个空位。逆序遍历一遍查询更新线段树就可以。
这个题简直要写哭了,本来是个基础题,但是我自己的线段树模板的左儿子lson是l,m,右儿子rson是m+1,r,程序直接跑崩了,右儿子改成m,r就可以过,并不是很懂为什么。要了学长的代码,学长写的是我模板那样的,但是我稍微改一下,将update和query合成一个就出问题了,很烦,改代码改了两天,还是不知道为什么,写的我好难过,想哭。难受。
先贴一下rson是m,r的,再贴一下rson是m+1,r的
代码1:
//E
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<queue>
#include<stack>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const double eps=1e-;
const int maxn=*1e5+;
#define lson l,m,rt<<1
#define rson m,r,rt<<1|1
struct node{
int pos,val;
}a[maxn]; int tree[maxn<<],ans[maxn]; void build(int l,int r,int rt){
tree[rt]=r-l;
if(tree[rt]==)
return ; int m=(l+r)>>;
build(lson);
build(rson);
} void update(int pos,int val,int l,int r,int rt){
--tree[rt];
if(r-l==){
ans[l]=val;
return ;
}
int m=(l+r)>>;
if(pos<tree[rt<<]) update(pos,val,lson);
else update(pos-tree[rt<<],val,rson);
} int main(){
int n;
while(~scanf("%d",&n)){
for(int i=;i<n;i++)
scanf("%d%d",&a[i].pos,&a[i].val);
build(,n,);
for(int i=n-;i>=;i--)
update(a[i].pos,a[i].val,,n,);
for(int i=;i<n;i++){
if(i==)printf("%d",ans[i]);
else printf(" %d",ans[i]);
}
cout<<endl;
}
return ;
}
代码2:
//自己手贱改一改试试
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<sstream>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long ll;
const int maxn=*1e5+;
const int inf=0x3f3f3f3f;
const int mod=;
const double eps=1e-;
typedef long long ll;
using namespace std;
struct node{
int pos,val;
}a[maxn];
int ans[maxn],vis[maxn];
int tree[maxn<<];
int p,v;
void PushUp(int rt){
tree[rt]=tree[rt<<]+tree[rt<<|];
}
void update(int l,int r,int rt)
{
int m=l+(r-l)/;
if(l==r)tree[rt]+=v;
else
{
if(p<=m)update(lson);
else update(rson);
PushUp(rt);
}
}
int query(int pos,int l,int r,int rt)
{
int m=l+(r-l)/;
if(tree[rt]==pos&&!vis[r])
return r;
if(tree[rt<<]>=pos)
return query(pos,lson);
else
return query(pos-tree[rt<<],rson);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(tree,,sizeof(tree));
memset(vis,,sizeof(vis));
for(int i=;i<n;i++)
{
v=;p=i;
update(,n-,);
}
for(int i=;i<n;i++)
{
scanf("%d%d",&a[i].pos,&a[i].val);
} for(int i=n-;i>=;i--)
{
int ret=query(a[i].pos+,,n-,);
ans[ret]=a[i].val;
vis[ret]=;
v=-;p=ret;
update(,n-,);
}
for(int i=;i<n;i++)
printf("%s%d",i==?"":" ",ans[i]);
printf("\n");
}
return ;
}
这5道线段树的题就先这样吧。
真的是难过,可这就是生活。
POJ 2828.Buy Tickets-完全版线段树(单点更新、逆序遍历查询)的更多相关文章
- POJ2828线段树单点更新——逆序更新
Description 输入n个有序对< pi, vi >,pi表示在第pi个位置后面插入一个值为vi的人,并且pi是不降的.输出最终得到的v的序列 Input 多组用例,每组用例第一行为 ...
- HDU 1754.I Hate It-结构体版线段树(单点更新+区间查询最值)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- POJ2528线段树段更新逆序异或(广告牌)
题意: 可以这样理解,有一条直线,然后用n条线段去覆盖,最后问全部都覆盖完之后还有多少是没有被完全覆盖的. 思路: 一开始想的有点偏,想到起点排序,然后..失败了,原因是忘记了题目 ...
- hihoCoder #1586 : Minimum-结构体版线段树(单点更新+区间最值求区间两数最小乘积) (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
#1586 : Minimum Time Limit:1000ms Case Time Limit:1000ms Memory Limit:256MB Description You are give ...
- HDU 1754 I Hate It(线段树单点更新区间最值查询)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 1754 I Hate It 线段树(单点更新,成段查询)
题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=1754 题解: 单点更新,成段查询. 代码: #include<iostream> ...
- POJ 2828 Buy Tickets(排队问题,线段树应用)
POJ 2828 Buy Tickets(排队问题,线段树应用) ACM 题目地址:POJ 2828 Buy Tickets 题意: 排队买票时候插队. 给出一些数对,分别代表某个人的想要插入的位 ...
- poj 2828 Buy Tickets(树状数组 | 线段树)
题目链接:poj 2828 Buy Tickets 题目大意:给定N,表示有个人,给定每一个人站入的位置,以及这个人的权值,如今按队列的顺序输出每一个人的权值. 解题思路:第K大元素,非常巧妙,将人入 ...
- poj 2828 Buy Tickets 【线段树点更新】
题目:id=2828" target="_blank">poj 2828 Buy Tickets 题意:有n个人排队,每一个人有一个价值和要插的位置,然后当要插的位 ...
随机推荐
- centos使用--ssh登陆
1 安装openssh-server yum install openssh-server 2 登录 在配置好ssh后就可以只使用SSH密钥登录而不允许通过密码登录了,方法如下: 修改ssh配置: v ...
- iOS笔记055 - UI总结01
1.程序启动后的开始动画 程序启动后可以加载一个简单的动画界面来介绍程序或者用户信息. 可以使用一个xib来描述界面.并且如果想在程序加载完成后第一个加载这个xib文件,需要在Appdelegat ...
- appium+python的APP自动化(1)
写这个东西也是自己喜欢研究些自动化的东西,以下全是自己的经验所得,由于开源的软件对于各版本以及操作系统要求很高,会经常碰到一些不兼容的问题,这个都属于正常的,换版本就对了. 本人的环境搭建都是在win ...
- selenium IDE录制脚本和自定义脚本-->Katalon Recorder(二)
selenium IDE提供了两种生成脚本的方式:录制脚本和自定义脚本 录制脚本:1.打开firefox空白标签,在标签上输入需要录制脚本的网址:2.打开selenium IDE界面中的录制按钮(圆形 ...
- DDT驱动
下载ddt并安装 Pip install ddt 或者官网下载安装 http://ddt.readthedocs.io/en/latest/ https://github.com/txels/ddt ...
- Python导出sql语句结果到Excel
本文档是因为每周需要统计线上数据库中客户新增资源,手动执行实在是麻烦,就写了个脚本导出到Excel,顺便发一封邮件. (当然这不是线上的真实脚本,不过根据个人需求稍微修改下,还是可以直接用的.拿去不谢 ...
- Android开发实例总结
写一个修改密码的界面 1画界面总结: 需要弄清楚什么地方用相对布局,什么地方使用线性布局 希望这过后自己花时间去弄清楚他们内嵌的的所有组件以及组件的属性包括用法. 2逻辑总结: 逻辑描述总是那么几步的 ...
- HDU 1532 基础EK Drainage Ditches
Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 清除浮动float (:after方法)
1. 什么时候需要清除浮动?清除浮动有哪些方法? (1)对元素进行了浮动(float)后,该元素就会脱离文档流,浮动在文档之上.在CSS中,任何元素都可以浮动.浮动元素会生成一个块级框,而不论它本身是 ...
- B-Tree索引和Hash索引的区别
Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-T ...