题解 洛谷P4198/BZOJ2957【楼房重建】
每个楼房,还有修改操作。简单的想到用线段树来维护信息。
显然线段树只需要维护y/x即可,对于每一个楼房,能看见的条件就是前面楼房的y/x的严格小于当前楼房的y/x。
线段树的区间修改不再赘述。
那么怎么维护可以看到的楼房数呢?
考虑在线段树的每一个节点上用一个变量sum
来表示从这个节点的左端点向右端点看时能看到多少楼房。
假设现在有一区间:1,5,8,0,7,9
。维护这个区间信息的节点编号为x
。
x<<1
维护的区间是1,5,8
,从1
往8
看可以看到三个楼房,故x<<1的sum
的值为3
。
x<<1|1
维护的区间是0,7,9
,从0
往9
看也可以看到三个楼房,故x<<1|1的sum
的值也为3
。
难道x的sum值
也为3+3=6
?错!
这显然是不能加在一起的,x的sum的值
为4。
为什么会错呢?应为右儿子x<<1|1
的观察视角不是从1开始的,是从0开始的。
显然0被挡住了。
显然,为什么这道题是紫题,主要难在的怎么上传信息。(不然就是黄牌了)
首先考虑每个线段树节点在维护一个mx
,mx
代表这个节点所代表的区间中所有的楼房中最高的高度。
上传时,由于两个儿子的sum
值是已经处理好的,而左儿子的视角是跟x
的视角一样的(对于上面的例子来说都是1),可以直接上传,即sum(x)+=sum(x<<1)
。
对于右儿子,考虑递归处理右儿子的区间,递归时带一个Mx
变量表示x的左儿子的最高的楼房(右儿子再左儿子后面,原因下面解释),递归的返回值是当前处理区间可以被看到的楼房数(从x的视角看)
对于现在处理的每一个区间:
- 如果这个区间的最高的楼房的高度都<=Mx(全部被挡住了),立即return 0
- 如果这个区间最左边的楼房高度>Mx(可以看到),那么return 当前区间维护的sum值。
- 如果这个区间只代表一个楼房,直接判断其能否被看到即可。
- 对于剩下的情况,递归儿子,分两种情况讨论:
- 如果左儿子的最高的楼房小于Mx(不能对答案有任何贡献),直接递归右儿子。
- 否则,递归左儿子,右儿子能看到的楼房个数为当前区间sum-左儿子sum即可,(应为下面已经更新好了,只需要直接调用就好了。)
Code(文中的sum用l代替):
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define lson x<<1
#define rson x<<1|1
using namespace std;
const int N=1e5+2;
struct Node {
double mx;
int l;
#define m(x) tree[x].mx
#define l(x) tree[x].l
} tree[N<<2];
int n,m;
double val[N];
inline void pushup_max(int x) {
m(x)=max(m(x<<1),m(x<<1|1));
}
inline int pushup_sum(double Mx,int x,int l,int r) {
if(m(x)<Mx)return 0;
if(val[l]>Mx)return l(x);
if(l==r)return val[l]>Mx;
int mid=(l+r)>>1;
if(m(lson)<=Mx)return pushup_sum(Mx,rson,mid+1,r);
else return pushup_sum(Mx,lson,l,mid)+l(x)-l(lson);
}
inline void change(int x,int l,int r,int pos,int value) {
if(l==r&&l==pos) {
m(x)=(double)value/pos;
l(x)=1;
return;
}
int mid=(l+r)>>1;
if(pos<=mid)change(lson,l,mid,pos,value);
else if(pos>mid)change(rson,mid+1,r,pos,value);
pushup_max(x);
l(x)=l(lson)+pushup_sum(m(lson),rson,mid+1,r);
}
int main() {
scanf("%d%d",&n,&m);
for(register int x,y,i=1; i<=m; ++i) {
scanf("%d%d",&x,&y);
val[x]=(double)y/x;
change(1,1,n,x,y);
printf("%d\n",l(1));
}
return 0;
}
题解 洛谷P4198/BZOJ2957【楼房重建】的更多相关文章
- Solution -「洛谷 P4198」楼房重建
\(\mathcal{Description}\) Link. 给定点集 \(\{P_n\}\),\(P_i=(i,h_i)\),\(m\) 次修改,每次修改某个 \(h_i\),在每次修改后 ...
- 洛谷P4198 楼房重建 (分块)
洛谷P4198 楼房重建 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题, ...
- 洛谷 P5021 [NOIP2018]赛道重建
洛谷 P5021 [NOIP2018]赛道重建 传送门 思路 思路就是常规的思路,所以就不说了--我就是来记录一下我的\(AC\)之路的,真的是太爽了 没错--我也是一个个打的部分分,最后终于AC的, ...
- 题解 洛谷P5018【对称二叉树】(noip2018T4)
\(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...
- 题解 洛谷 P3396 【哈希冲突】(根号分治)
根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...
- 题解-洛谷P4229 某位歌姬的故事
题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...
- 题解-洛谷P4724 【模板】三维凸包
洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...
- 题解-洛谷P4859 已经没有什么好害怕的了
洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...
随机推荐
- 【135】NoteExpress使用中的问题
NoteExpress主要是用来管理文献,然后可以方便管理,方便插入,各种方便吧! 关于NoteExpress的下载可以直接搜索进入官网下载,为了不用破解之类的,可以选择大学版的! 引文显示上标!ht ...
- 关于spring MVC中获取客户端的IP地址
1. 引入HttpServletRequest @Autowired private HttpServletRequest request; 2. 获取IP地址 private static Stri ...
- Extjs 4 MVC中全局配置文件
Extjs 4 Config和Mixins http://kldn.iteye.com/blog/1386622 http://www.fengfly.com/html/JavaScript/ExtJ ...
- ubuntu中desktop与alternate版本的区别(转载)
转自:http://www.hyleong.com/ubuntu-desktop-alternate/ 今天ubuntu发布了11.04版本,但是下载的时候有desktop和alternate版本,他 ...
- ASP.NET Core MVC 打造一个简单的图书馆管理系统 (修正版)(五)外借/阅览图书信息的增删改查
前言: 本系列文章主要为我之前所学知识的一次微小的实践,以我学校图书馆管理系统为雏形所作. 本系列文章主要参考资料: 微软文档:https://docs.microsoft.com/zh-cn/asp ...
- StretchedBillboard 实现
参考Unity粒子系统的StretchedBillboard,在保持模型的右朝向不变的情况下,尽量朝向摄像机 转化为数学问题: 一个向量在一个面上的投影 基础的Billboard的方向应为: 从中点指 ...
- CentOS中设置Windows共享文件夹
在CentOS中设置Samba可实现和Windows共享文件夹.常见的需求:1)用户能够在Windows机器上通过共享文件夹访问远程Linux服务器上自己的主目录:2)用户能够在Windows机器上访 ...
- 安装MySQL需要注意的事项
一.安装MySQL之后,怎样启动MySQL,以及登录.查看数据库操作? 用管理员身份运行cmd或power shell 二.当然有可能会出现不能在cmd或power shell中登录数据库账户 造成这 ...
- 使用python计算softmax函数
softmax计算公式: Softmax是机器学习中一个非常重要的工具,他可以兼容 logistics 算法.可以独立作为机器学习的模型进行建模训练.还可 ...
- 图论/位运算 Codeforces Round #285 (Div. 2) C. Misha and Forest
题目传送门 /* 题意:给出无向无环图,每一个点的度数和相邻点的异或和(a^b^c^....) 图论/位运算:其实这题很简单.类似拓扑排序,先把度数为1的先入对,每一次少一个度数 关键在于更新异或和, ...