P4198-楼房重建【线段树】
正题
题目链接:https://www.luogu.com.cn/problem/P4198
题目大意
\(n\)条线,开始时第\(i\)条是\((i,0)\)的一个点。
每次有操作把第\(x\)条线变成\((x,0)\)到\((x,y)\)。然后求从\((0,0)\)能看到几条线。
解题思路
把线变成斜率的话就是对于每个点求一个往后比它大的第一个点然后一直跳来做了。
线段树的话主要是合并区间的时候比较麻烦,一个暴力的想法是直接维护每个区间的序列,然后合并的时候一个在另一个上面二分,但是这样合并的复杂度是\(O(len)\)的。
发现我们需要的只是在右区间的序列上二分而已,而右区间的序列是由它线段树上的子树得到,所以我们没有必要真正的存下来维护的序列,可以直接在右边的线段树上二分。
大概的操作就是右边分出来的左右两个区间,如果左边的区间最大值要比目前的值要小,那么左边区间没有贡献,直接到右边。否则那么这样跳一定会到达左边区间的最大值,然后就是递归求右边区间的答案,这部分答案我们已经处理完了,直接累加然后递归作左区间即可。
这样时间复杂度就是\(O(n\log^2 n)\)的了
code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n,m,len[N<<2];
double w[N<<2],a[N];
int PushUp(double val,int x,int L,int R){
if(w[x]<=val)return 0;
if(L==R)return a[L]>val;
int mid=(L+R)>>1;
if(w[x*2]<=val)return PushUp(val,x*2+1,mid+1,R);
return len[x]-len[x*2]+PushUp(val,x*2,L,mid);
}
void Change(int x,int L,int R,int pos,double val){
if(L==R){w[x]=a[L]=val;len[x]=1;return;}
int mid=(L+R)>>1;
if(pos<=mid)Change(x*2,L,mid,pos,val);
else Change(x*2+1,mid+1,R,pos,val);
w[x]=max(w[x*2],w[x*2+1]);
len[x]=len[x*2]+PushUp(w[x*2],x*2+1,mid+1,R);
}
int main()
{
scanf("%d%d",&n,&m);
while(m--){
int x,y;
scanf("%d%d",&x,&y);
Change(1,1,n,x,(double)y/x);
printf("%d\n",len[1]);
}
return 0;
}
P4198-楼房重建【线段树】的更多相关文章
- luogu P4198 楼房重建——线段树
题目大意: 小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度.如果这栋楼房上任何一个高度大于0的点与(0,0)的连线没有与之前的线 ...
- [Luogu P4198]楼房重建(线段树)
题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个 ...
- 洛谷P4198 楼房重建(线段树)
题意 题目链接 Sol 别问我为什么发两遍 就是为了骗访问量 这个题的线段树做法,,妙的很 首先一个显然的结论:位置\(i\)能被看到当且仅当\(\frac{H_k}{k} < \frac{H_ ...
- [BZOJ29957] 楼房重建 - 线段树
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3294 Solved: 1554[Submit][Status][Discus ...
- luogu题解P4198楼房重建--线段树神操作
题目链接 https://www.luogu.org/problemnew/show/P4198 分析 一句话题意,一条数轴上有若干楼房,坐标为\(xi\)的楼房有高度\(hi\),那么它的斜率为\( ...
- bzoj 2957: 楼房重建 线段树
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 小A的楼房外有一大片施 ...
- bzoj 2957: 楼房重建 ——线段树
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- bzoj2957 楼房重建——线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2957 线段树维护两个值:cnt 能看到的最多楼房数: mx 最大斜率数: 对于一段区间,从左 ...
- bzoj 2957 楼房重建 (线段树+思路)
链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2957 思路: 用分块可以很简单的过掉,但是这道题也可以用线段树写. 分类讨论左区间最大值对 ...
- BZOJ 2957 楼房重建(线段树区间合并)
一个显而易见的结论是,这种数字的值是单调递增的.我们修改一个数只会对这个数后面的数造成影响.考虑线段树划分出来的若干线段. 这里有两种情况: 1.某个线段中的最大值小于等于修改的数,那么这个线段的贡献 ...
随机推荐
- Leaflet 中 删除 一组 标记(Marker)
动态显示一个标签: L.marker([obj.Y,obj.X]).addTo(map).bindPopup(obj.name).openPopup(); let layers=[]; let myG ...
- Object 类中的主要结构
== 操作符与equals 方法 == 操作符 equals 方法 重写equals() 方法的 toString() 方法
- 十一:JavaWeb中的监听器(二)
一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...
- SpringCloud 商品架构例子(一)
架构演进和分布式系统基础知识 1.传统架构演进到分布式架构 简介:讲解单机应用和分布式应用架构演进基础知识 高可用 LVS+keepalive 单体应用: 集群: 微服务架构: 1.单体应用: 开发速 ...
- pip 源的问题
pip install -i https://pypi.doubanio.com/simple/ --trusted-host pypi.douban.com some-package
- Win10 安装WSL2与 Linux子系统
Win10安装Linux子系统 1. 正常情况 步骤1 - 启用 Windows Linux版本子系统(Windows Subsystem for Linux) dism.exe /online /e ...
- Pycharm去除波浪线等相关操作
- 【数据库上】 第四讲 E-R模型基础知识
第四讲 E-R模型基础知识 一.数据库设计过程 数据库设计的关键阶段? 各个阶段设计的主要任务? 基础条件:清楚一个应用系统的功能需求与数据需求(直接与用户交互.数据流程图示例/UML类图等) 核心阶 ...
- github搜索技巧小结
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- stream流思想应用
1.计算集合中某字段数值和 subTotal = subTotal+ complainCountResult.stream().filter(childSource->childSource.g ...