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个人排队,每一个人有一个价值和要插的位置,然后当要插的位 ...
随机推荐
- 初学JS——利用JS制作的别踩白块儿(街机模式) 小游戏
这个是上个星期5写的了,当时是突然想写个游戏,就想到了别踩白块儿,当时的想法是 可能普通模式的别踩白块儿因为他的“块儿”是滚动的向上这种,以我目前会的技术想不出怎么写, 但是如果是街机模式,通过你每按 ...
- Hyper-V 安装Windows 2008,08 R2,12 R2 无网卡驱动的解决办法
最近玩 Hyper -V ,都是在网上找的资料进行操作的.后面发觉园友提供的一些操作 按部就班的做下来,别人 可以 ,我的就是不行. 最近就遇到一个很烦闷的事情.(如题) 安装好系统之后 发现 没有网 ...
- java中利用正则表达式获取a标签
// 设置新闻内容 notice.setContent(editorValue); Matcher m = Pattern.compile("<a[^>]*>([^< ...
- python multiprocessing.Pool 中map、map_async、apply、apply_async的区别
multiprocessing是python的多进程库,multiprocessing.dummy则是多线程的版本,使用都一样. 其中都有pool池的概念,进程池/线程池有共同的方法,其中方法对比如下 ...
- idea中maven项目放到包中的mapper的xml文件不发布的问题
今天重新一下mybatis的基础,然后一直报错,提示的是 result map 找不到com.zm.model.User对象可是看 mapper的写法没问题.找了半天才发现 是mapper没扫描到 解 ...
- iis如何处理并发请求
文章:IIS是怎么处理同时到来的多个请求的? 文章:你真的了解:IIS连接数.IIS并发连接数.IIS最大并发工作线程数.应用程序池的队列长度.应用程序池的... 文章:IIS最大工作进程数设置引发串 ...
- Python洗牌算法重写
Python有自带的洗牌算法函数shuffle(). 自己也通过学习也琢磨了一下它的实现,然后给出一个时间复杂度O(n),空间复杂度O(4)的例子: import random def shuffle ...
- canvas 基础
1.<canvas>元素 <canvas id="tutorial" width="150" height="150"&g ...
- ASP.NET——视频总结
ASP.NET的视频很早就看完了,但一直还没顾上总结.虽然在备战软考,学习任务很重,但是阶段的总结还是不要推太久了,不然也就起不到总结的效果了.在看视频之前,虽然已经做过了新闻发布系统,但是对B/S一 ...
- 洛谷 P3573 [POI2014]RAJ-Rally 解题报告
P3573 [POI2014]RAJ-Rally 题意: 给定一个\(N\)个点\(M\)条边的有向无环图,每条边长度都是\(1\). 请找到一个点,使得删掉这个点后剩余的图中的最长路径最短. 输入输 ...