【经典问题】bzoj2957: 楼房重建
经典问题:动态维护上升子序列长度
进阶问题:【经典问题】#176. 栈
Description
小A的楼房外有一大片施工工地,工地上有N栋待建的楼房。每天,这片工地上的房子拆了又建、建了又拆。他经常无聊地看着窗外发呆,数自己能够看到多少栋房子。
为了简化问题,我们考虑这些事件发生在一个二维平面上。小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度。如果这栋楼房上任何一个高度大于0的点与(0,0)的连线没有与之前的线段相交,那么这栋楼房就被认为是可见的。
施工队的建造总共进行了M天。初始时,所有楼房都还没有开始建造,它们的高度均为0。在第i天,建筑队将会将横坐标为Xi的房屋的高度变为Yi(高度可以比原来大---修建,也可以比原来小---拆除,甚至可以保持不变---建筑队这天什么事也没做)。请你帮小A数数每天在建筑队完工之后,他能看到多少栋楼房?
Input
第一行两个正整数N,M
接下来M行,每行两个正整数Xi,Yi
Output
M行,第i行一个整数表示第i天过后小A能看到的楼房有多少栋
数据约定
对于所有的数据1<=Xi<=N,1<=Yi<=10^9
N,M<=100000
题目分析
线段树的巧妙应用:对于每一个线段树区间记录最大值$mx$和以其左端点为起点的答案$ans$。
考虑信息如何合并:对于区间rt,首先肯定继承了rt.lson的答案,再者若rt.rson的最大值rson.mx<lson.mx,也即右区间再不会被访问到了;否则考虑rson的两个子区间,如果rson.lson.mx<lson.mx只需考虑rson.rson,反之答案就是rson.ans(原先rson两个区间的答案和)-rson.lson.ans(现在以rt.lson.mx为起点,需要重新计算rson.lson的贡献;剩下的rson.rson.ans由于是以rson.lson为起点,那么必定是考虑完rson.lson.mx的答案之后的贡献,因此不必改变)+calc(rson.lson)($\text{calc}$即重复以上的统计过程)。

图示如上:
(话说第一发居然因为eps开太小WA了一次)
#include<bits/stdc++.h>
const int maxn = ;
const double eps = 1e-; struct node
{
int ans;
double mx;
}f[maxn<<];
int n,m; int read()
{
char ch = getchar();
int num = , fl = ;
for (; !isdigit(ch); ch=getchar())
if (ch=='-') fl = -;
for (; isdigit(ch); ch=getchar())
num = (num<<)+(num<<)+ch-;
return num*fl;
}
int calc(int rt, int l, int r, double c)
{
if (l==r) return f[rt].mx > c;
int mid = (l+r)>>;
if (f[rt<<].mx-c <= eps) return calc(rt<<|, mid+, r, c);
return f[rt].ans-f[rt<<].ans+calc(rt<<, l, mid, c);
}
void modify(int rt, int l, int r, int pos, double c)
{
if (l==r) f[rt].ans = , f[rt].mx = c;
else{
int mid = (l+r)>>;
if (pos <= mid) modify(rt<<, l, mid, pos, c);
else modify(rt<<|, mid+, r, pos, c);
f[rt].mx = std::max(f[rt<<].mx, f[rt<<|].mx);
f[rt].ans = f[rt<<].ans+calc(rt<<|, mid+, r, f[rt<<].mx);
}
}
int main()
{
n = read(), m = read();
for (; m; --m)
{
int x = read(), y = read();
modify(, , n, x, 1.0*y/x);
printf("%d\n",f[].ans);
}
return ;
}
END
【经典问题】bzoj2957: 楼房重建的更多相关文章
- BZOJ2957: 楼房重建(线段树&LIS)
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3727 Solved: 1793[Submit][Status][Discus ...
- Bzoj2957 楼房重建
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1516 Solved: 723[Submit][Status][Discuss] Descripti ...
- [bzoj2957][楼房重建] (线段树)
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- 【数据结构】bzoj2957楼房重建
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- 【分块】bzoj2957 楼房重建
http://www.cnblogs.com/wmrv587/p/3843681.html ORZ 分块大爷.思路很神奇也很清晰. 把 块内最值 和 块内有序 两种良好的性质结合起来,非常棒地解决了这 ...
- BZOJ2957 楼房重建 【线段树】
题目 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个二维 ...
- [BZOJ2957] 楼房重建 (线段树,递归)
题目链接 Solution 经典的一道线段树题,难点在于如何合并节点. 由于题目要求直线要求不相交,则斜率均大于前面的点即为答案. 所以以斜率为权值. 考虑线段树每一个节点维护两个值: \(Max\) ...
- bzoj2957 楼房重建——线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2957 线段树维护两个值:cnt 能看到的最多楼房数: mx 最大斜率数: 对于一段区间,从左 ...
- BZOJ2957: 楼房重建(分块)
题意 题目链接 Sol 自己YY出了一个\(n \sqrt{n} \log n\)的辣鸡做法没想到还能过.. 可以直接对序列分块,我们记第\(i\)个位置的值为\(a[i] = \frac{H_i}{ ...
随机推荐
- Murano Weekly Meeting 2015.12.01
Meeting time: 2015.December.1st 1:00~2:00 Chairperson: Nikolay Starodubtsev, from Mirantis Meeting ...
- idea编译golang插件总结
由于使用习惯了Idea 和vim插件.于是下载了idea的go插件并安装,可惜不支持go1.4 ,官方的go插件版本太低 133.326 — 133.9999 .只能手动编译 按照这个教程就可以 ht ...
- 通过rsync+inotify实现数据的实时备份(多台备份机)
在前面的博文中,我讲到过利用rsync实现数据的镜像和备份,但是要实现数据的实时备份,单独靠rsync还不能实现,本文就讲述下如何实现数据的实时备份. 一.rsync的优点与不足 与传统的cp.ta ...
- HDU 4364——Matrix operation——————【模拟题】
Matrix operation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- net图片转格式
http://blog.csdn.net/nrlovestudy/article/details/48137339 图片转格式 Bitmap bmp=new Bitmap("filename ...
- 在项目引用里添加上对Microsoft Word 11.0 object library的引用
private void button1_Click(object sender, System.EventArgs e) { //调用打开文件对话框获取要打开的文件WORD文件,RTF文件,文本文件 ...
- HttpFlexSession注册失败的怪问题
web.xml中已经注册了HttpFlexSession <listener> <listener-class>flex.messaging.HttpFlexSession&l ...
- npm package.json字段全解
name 在package.json中最重要的就是name和version字段.他们都是必须的,如果没有就无法install.name和version一起组成的标识在假设中是唯一的.改变包应该同时改变 ...
- centos yum 安装jdk后配置JAVA_HOME
centos6.4 yum 安装jdk和JAVA_HOME的设置 2014-06-17 16:13 1176人阅读 评论(0) 收藏 举报 分类: linux(3) 版权声明:本文为博主原创文章, ...
- WebSocket Demo
HTML 代码: <body> <h1>WebScoket示例</h1> <br /><br /> <input type=" ...