喵哈哈村的冒菜店(线段树 区间合并)
喵哈哈村的冒菜店
发布时间: 2017年3月19日 16:00 最后更新: 2017年3月19日 16:01 时间限制: 1000ms 内存限制: 128M
喵哈哈村的冒菜店开张了,这里的冒菜特别好吃。
星星同学听闻后,就准备去吃冒菜。
星星同学开着自己才花了几十万买的宝马X5,就开进了冒菜店的停车场。
就在她停车的过程中,她发现一个有趣的现象,喵哈哈村的人们总是喜欢停车停在离别人车最远的地方,具体来说就是停在离所有车的距离最小值最大的位置,如果有多个,他们就喜欢停在编号小的位置上。
现在星星同学有一个疑问了:
这个停车场可以看做是拥有一排的停车位,这些停车位编号为1~n,初始都是空的。
如果有若干个汽车进进出出这停车场,那么这些汽车会停在哪些位置呢?
第一行两个整数n,m,表示停车场大小和操作数。
接下来m行,每行两个整数F和x。
F是1表示编号为x的车进停车场。
F是2表示编号为x的车出停车场。
保证操作合法。
满足n,m<=200000,x<=1000000
对于所有操作1,输出一个整数,表示该车车位的编号。
7 11 1 15 1 123123 1 3 1 5 2 123123 2 15 1 21 2 3 1 6 1 7 1 8
1 7 4 2 7 4 1 3
用线段树来做,首先我们对区间[1..n]开一课线段树。对于每一个节点,维护4个值。分别是l,r,mid,p。l表示在当前结点线段树所在区间,最左边的车停的位置。同理,r表示做右边的车所停的位置。mid表示在这个小区间[l,r]中的紧邻的两辆车的最长距离除以2后的值。p表示取得mid值是所在的紧邻的两辆车的中间位置,也就是在[l,r]中的答案值。
对于 1 询问:访问线段树的第一个节点,我们比较l-1,n-r,mid的值哪个更大,就选哪个,它们的答案依次是1,n,mid。假设我们求得的位置是car[x]。然后访问[car[x],car[x]]所在的线段树的叶子节点,初始化它的值,然后回溯,进行合并。对于h[x].l与h[x].r可以通过两个儿子的l,r信息得出。对于h[x].mid值,首先在左右儿子的mid值中去一个最大的值。其次考虑一种情况,就是夹在两个线段之间的距离,可以通过(h[x+x+1].l-h[x+x].r) div 2 的值得出在于mid进行比较,然后p就随着mid的值的更新而更新。
对于2询问:访问询问车所在的位置,直接将它的叶子节点[car[x],car[x]]删除,然后回溯时,再做一次合并操作。即可。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <string>
using namespace std;
const int N = 200010;
struct node
{int l, r, mid, p;
} sum[1000010];
int car[1000010];
void pushup(int rt)
{if(sum[rt<<1].l>0) sum[rt].l=sum[rt<<1].l;else sum[rt].l=sum[(rt<<1)+1].l;if(sum[rt<<1|1].r>0) sum[rt].r=sum[rt<<1|1].r;else sum[rt].r=sum[rt<<1].r;sum[rt].mid=sum[rt<<1].mid,sum[rt].p=sum[rt<<1].p;if(sum[rt<<1|1].l>0&&sum[rt<<1].r>0){int t=(sum[rt<<1|1].l-sum[rt<<1].r)/2;if(t>sum[rt].mid){sum[rt].mid=t,sum[rt].p=(sum[rt<<1|1].l+sum[rt<<1].r)/2;}if(sum[rt<<1|1].mid>sum[rt].mid){sum[rt].mid=sum[rt<<1|1].mid,sum[rt].p=sum[rt<<1|1].p;}}return ;
}
void update(int l,int r,int rt,int pos,int kind)
{if(l==r){if(kind==1){sum[rt].l=l,sum[rt].r=r,sum[rt].mid=0,sum[rt].p=0;}else{sum[rt].l=0,sum[rt].r=0,sum[rt].mid=0,sum[rt].p=0;}return ;}int mid=(l+r)/2;if(pos<=mid) update(l,mid,rt<<1,pos,kind);else update(mid+1,r,(rt<<1)+1,pos,kind);pushup(rt);return ;
}int main()
{int n, q;scanf("%d %d", &n, &q);for(int i=0; i<q; i++){int x, num;scanf("%d %d", &x, &num);if(x==1){if(sum[1].l==0) car[num]=1;else{int y=-1;if(sum[1].l-1>y) y=sum[1].l-1,car[num]=1;if(sum[1].mid>y) y=sum[1].mid,car[num]=sum[1].p;if(n-sum[1].r>y) y=n-sum[1].r,car[num]=n;}printf("%d\n",car[num]);update(1,n,1,car[num],1);}else update(1,n,1,car[num],2);}return 0;
}
喵哈哈村的冒菜店(线段树 区间合并)相关推荐
- 树链剖分——线段树区间合并bzoj染色
线段树区间合并就挺麻烦了,再套个树链就更加鬼畜,不过除了代码量大就没什么其他的了.. 一些细节:线段树每个结点用结构体保存,pushup等合并函数改成返回一个结构体,这样好写一些 struct Seg ...
- SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并
Can you answer these queries III SPOJ - GSS3 这道题和洛谷的小白逛公园一样的题目. 传送门: 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间 ...
- Tunnel Warfare(HDU1540+线段树+区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目: 题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的 ...
- CodeForces - 1539F Strange Array(线段树区间合并)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,规定位置 iii 的贡献是:设 x=a[i]x=a[i]x=a[i],选择一个包含 iii 的区间 [l,r][l,r][l,r],将其中 ...
- 牛客 - 求函数(线段树+区间合并/线段树+矩阵维护)
题目链接:点击查看 题目大意:现在有 n 个函数,每个函数都是诸如 f( x ) = k * x + b 的形式,只是每个函数的 k 和 b 都是相互独立的,现在给出两个操作: 1 pos k b:将 ...
- 2021牛客暑期多校训练营7 xay loves monotonicity 线段树区间合并
传送门 文章目录 题意: 思路: 题意: 题面挺绕口的,还是看原题比较好. 大概的意思就是让你从给定的区间中选择一个以左端点为起点的一个上升子序列,让后将这些下标存下来,在bbb中将这些位置拿出来后, ...
- poj-3667(线段树区间合并)
题目链接:传送门 参考文章:传送门 思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树. #include<iostream> #include<cstdio ...
- HDU3308 线段树区间合并
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 ,简单的线段树区间合并. 线段树的区间合并:一般是要求求最长连续区间,在PushUp()函数中实 ...
- HDU1540(线段树区间合并)
很经典的一道题,线段树区间合并非常好的一道入门题,每个节点保存区间连续1的最大左串长度,最大右串长度,以及区间最大长度(常规的三种信息维护),更新操作时注意push_up函数,针对不同的问题,push ...
最新文章
- 推荐10个能带来快感的实用windows软件,好评如潮!
- Reactive Extensions入门(5):ReactiveUI MVVM框架
- 牛客多校2 - Fake Maxpooling(线性递推gcd+单调队列)
- android 动态控制截屏,应用助手for Android新版本:可动态截屏存图
- 9 月 19 日,腾讯云安全中心监测到 Apache Tomcat 修复了2个严重级别的漏洞, 分别为: 信息泄露漏洞(CVE-2017-12616)、远程代码执行漏洞(CVE-2017-12615
- leetcode —— 38. 外观数列
- shell批量文件编码转换
- 程序员常见的口头禅汇总,你中招了没?
- C# WPF DataGrid在Grid中自适应窗体大小
- MAC可以在.zshrc中修改PATH
- java中求梯形的面积_java 求梯形面积
- Java应届生为什么找工作那么难
- 评:10月PMI指数新高, 带动大盘逆转, 跨年度业绩行情展开
- 【事件图谱】事件抽取与事件关系抽取
- Android模拟器无法上网问题ZZ
- 迁移mysql数据库报错_数据库迁移失败报错
- 骨传导蓝牙耳机哪款好,性价比较高的骨传导耳机推荐
- 兄弟MFC-1919NW一体机远程连接默认密码
- RTOS面试常问题目
- 项目方按本纲要编制商业计划书范本