P4198 楼房重建
P4198 楼房重建
集中写博客= =
首先把高度变成斜率
然后就比较玄学了,首先用线段树维护一个区间的斜率最大值,和只看这个区间时能看见的楼房个数ans
然后更新时先更新max,再处理神奇的ans
如果max[ls]>=max[rs],那么右区间都被遮住了可以不考虑,答案是ans[ls]
否则考虑右区间,写一个函数calc(x,h)表示x区间的最左边有一栋高h的楼房,此时x区间能看见几栋楼房,所以这时答案是ans[ls]+calc(rs,max[ls])
然后下面是calc(x,h)的实现
如果现在max[rs.ls]<=max[ls],那么只需递归考虑右区间的右区间,calc(rs,h)
最后就是max[rs.ls]>max[ls],那么右边能看到的依然能看到,只需要重新考虑左边区间,ans[x]-ans[ls]+calc(ls,h)
#include<bits/stdc++.h>
#define il inline
#define vd void
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
int ans[100010<<2];
double max[100010<<2];
#define mid ((l+r)>>1)
#define ls (x<<1)
#define rs (x<<1|1)
il double calc(int x,int l,int r,double&h){
if(l==r)return max[x]>h;
if(max[ls]<=h)return calc(rs,mid+1,r,h);
else return ans[x]-ans[ls]+calc(ls,l,mid,h);
}
il vd update(int x,int l,int r,int&p,double&h){
if(l==r){max[x]=h;ans[x]=1;return;}
if(p<=mid)update(ls,l,mid,p,h);
else update(rs,mid+1,r,p,h);
max[x]=std::max(max[ls],max[rs]);
if(max[rs]<=max[ls])ans[x]=ans[ls];
else ans[x]=ans[ls]+calc(rs,mid+1,r,max[ls]);
}
int main(){
int n=gi(),m=gi();
for(int i=1;i<=m;++i){
int x=gi();
double y=gi()*1.00/x;
update(1,1,n,x,y);
printf("%d\n",ans[1]);
}
return 0;
}
P4198 楼房重建的更多相关文章
- 洛谷P4198 楼房重建 (分块)
洛谷P4198 楼房重建 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题, ...
- 洛谷 P4198 楼房重建 线段树维护单调栈
P4198 楼房重建 题目链接 https://www.luogu.org/problemnew/show/P4198 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上 ...
- luogu题解P4198楼房重建--线段树神操作
题目链接 https://www.luogu.org/problemnew/show/P4198 分析 一句话题意,一条数轴上有若干楼房,坐标为\(xi\)的楼房有高度\(hi\),那么它的斜率为\( ...
- 【题解】Luogu P4198 楼房重建
原题传送门 根据斜率来建线段树,线段树维护区间最大斜率以及区间内能看见的楼房的数量(不考虑其他地方的原因,两个节点合并时再考虑) 细节见程序 #include <bits/stdc++.h> ...
- luogu P4198 楼房重建——线段树
题目大意: 小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度.如果这栋楼房上任何一个高度大于0的点与(0,0)的连线没有与之前的线 ...
- 【洛谷】P4198 楼房重建
题解 我们转而维护每个点的斜率,显然一个楼房能被看见它就是一个前缀最大值,斜率比较为了节约精度可以用向量替代 我们每个区间维护被看到的楼房的个数,和楼房的最大值,叶子节点在有楼房时,值为1 那么考虑合 ...
- [Luogu P4198]楼房重建(线段树)
题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个 ...
- [Luogu] P4198 楼房重建
题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个 ...
- 洛谷 P4198 楼房重建 题解
题面 首先你要知道题问的是什么:使用一种数据结构,动态地维护以1为起点地最长上升子序列(把楼房的高度转化成斜率地序列)的长度: 怎么做?线段树! 我们在线段树上维护两个东西:1.这个区间内斜率的最大值 ...
随机推荐
- flask的orm操作
django是有orm操作的 可想而知 那么flask也是有orm操作的,其实flask的orm操作的使用和djnago的是差不多的 django的orm操作进行条件筛选的时候后面跟着的是objec ...
- golang 防知乎 中文验证码 源码
原创,转载请注明出处! 最开始用图形来模仿文字进行各种角度的倒立和排列,后来切换为文字后,有很多问题.总结如下: 1.程序在画图形和画文字方面不一样,图形的是从原点开始(0,0),而文字则从文字的基线 ...
- KInect AR沙盒制作的一点小经验
最近在微博上看到这样一条 微博 >点这看< 看起来非常有意思,就去Google了一下如何制作. 没想到这是一个开源项目,而且还告诉你如何安装 OK,接下来就说说我的制作过程. 首先,先放 ...
- [EffectiveC++]item32:确定你的public继承模塑出is-a关系
- 推荐一个好用的以多tab标签方式打开windows CMD的工具
最近我在做基于nodejs的微服务开发,需要在windows命令行里启动很多微服务.我的windows 10任务栏是这样子的: 我想找一款能像下图Chrome标签页这样打开windows 10 CMD ...
- Ext 向Ext.form.ComboBox()中添加列表的分类
1.静态 [javascript] view plaincopy var staticComboBox = new Ext.form.ComboBox({ fieldLabel:'回访结果', ...
- [Violet]天使玩偶/SJY摆棋子
题目 \(KD-tree\)做最近点对的复杂度好像是假的吧,怎么看也看不出来是\(O(\sqrt{n})\)啊 首先\(KD-tree\)长得和平衡树还是很像的,每个节点都存储了一个\(k\)维空间上 ...
- HBase学习之路 (八)HBase大牛博客
主要是记录一下链接 http://hbasefly.com
- 下拉控件jQuery插件
由于后端开发需要一个下拉控件,能输入,能选择,于是自己写了一个 ;(function($,window,document,undefined){ function Select(el,opt){ th ...
- django restframework 快速入门
django restframework 快速入门 基本流程 建立 Models 依靠 Serialiers 将数据库取出的数据 Parse 为 API 的数据(可用于返回给客户端,也可用于浏览器显示 ...