[BZOJ 2957]楼房重建(线段树)
Description
小A的楼房外有一大片施工工地,工地上有N栋待建的楼房。每天,这片工地上的房子拆了又建、建了又拆。他经常无聊地看着窗外发呆,数自己能够看到多少栋房子。
为了简化问题,我们考虑这些事件发生在一个二维平面上。小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度。如果这栋楼房上任何一个高度大于0的点与(0,0)的连线没有与之前的线段相交,那么这栋楼房就被认为是可见的。
施工队的建造总共进行了M天。初始时,所有楼房都还没有开始建造,它们的高度均为0。在第i天,建筑队将会将横坐标为Xi的房屋的高度变为Yi(高度可以比原来大---修建,也可以比原来小---拆除,甚至可以保持不变---建筑队这天什么事也没做)。请你帮小A数数每天在建筑队完工之后,他能看到多少栋楼房?
Solution
把每栋楼房高度角的tan值放在线段树上维护,然后就变成了一个动态求最长上升子序列的问题
于是线段树每个节点都维护max和ans,这个ans可以由左子树的ans+右子树中大于左边max的最长上升子序列得到,后面的这一部分可以在右子树进行二分
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #define MAXN 100005 using namespace std; int n,m; int read() {int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f; } struct Node {int l,r,ans;double maxn; }t[MAXN*4]; void build(int idx,int l,int r) {t[idx].l=l,t[idx].r=r,t[idx].maxn=t[idx].ans=0;if(l==r)return;int mid=(l+r)>>1;build(idx<<1,l,mid),build(idx<<1|1,mid+1,r); } int update(int idx,double v) {if(t[idx].l==t[idx].r)return t[idx].maxn>v;if(t[idx<<1].maxn<=v)return update(idx<<1|1,v);return t[idx].ans-t[idx<<1].ans+update(idx<<1,v); } void add(int idx,int p,double x) {if(t[idx].l==t[idx].r){t[idx].maxn=x;t[idx].ans=1;return;}int mid=(t[idx].l+t[idx].r)>>1;if(p<=mid)add(idx<<1,p,x);else add(idx<<1|1,p,x);t[idx].maxn=max(t[idx<<1].maxn,t[idx<<1|1].maxn);t[idx].ans=t[idx<<1].ans+update(idx<<1|1,t[idx<<1].maxn); } int main() {n=read(),m=read();build(1,1,n);for(int i=1;i<=m;i++){int x=read(),y=read();add(1,x,(double)y/x);printf("%d\n",t[1].ans);}return 0; }
转载于:https://www.cnblogs.com/Zars19/p/6964199.html
[BZOJ 2957]楼房重建(线段树)相关推荐
- BZOJ 2957楼房重建
传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...
- bzoj 2957: 楼房重建(线段树+递归)
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 2778 Solved: 1314 [Submit][Status][Disc ...
- [BZOJ 2957]楼房重建(THU2013集训)(线段树维护单调栈)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2957 分析: 根据题意,就是比较斜率大小 只看一段区间的话,那么这段区间能看见的楼房数量就是这 ...
- 【BZOJ—2957楼房重建】【连载:请在T台上微笑】
长久没有发博文了...对对对, 所以最近就趁着暑假多发发吧 颓废是革命的本钱: 推荐一个我喜欢的新连载漫画吧[请在T台上微笑] BZOJ 2957 [楼房重建] Description 小A的楼房外有 ...
- P4198 楼房重建 线段树 + 区间合并
传送门 文章目录 题意: 思路: 题意: 题面有点问题,按照人类正常的理解来就好啦. 思路: 可以想到维护每个位置的一个斜率,模拟的话就是从第一个位置开始向后选,当某个位置斜率大于当前位置的时候,答案 ...
- LG P4198 楼房重建(线段树)
LG P4198 楼房重建 Solution 基础的线段树题,虽然我还不熟练就是了. 大概就是单点修改,求全局的极大子序列. 我们需要维护一个区间最大值aaa和极大子序列长度sss. 合并xxx的左右 ...
- BZOJ2957:楼房重建(线段树)
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- BZOJ 2957: 楼房重建
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- bzoj 2957 楼房重建
http://www.elijahqi.win/archives/3479 Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经 ...
最新文章
- 20130717随想
- Windows XP解决显示桌面图标消失的问题
- Android异常处理——try、catch、finally、throw、throws
- 处理异常:org.springframework.beans.factory.BeanNotOfRequiredTypeException
- tiny6410裸机实验第0章--------------开发环境的搭建(USB转串口)
- STM32旋转立方体
- CDD数据库文件制作(一)
- 解决ERROR:Local variable count defined in an enclosing scope must be final or effectively final
- opencv+python+OpenPose姿态实时识别
- android仿微信红包动画,Android仿微信打开红包动画(逐帧动画)
- 基因家族的鉴定-基于windows系统上的本地blast
- 力扣刷题day42|121买卖股票的最佳时机、122买卖股票的最佳时机II
- 2021年国企、银行求职面经汇总(更新中)
- 树莓派安装Ubuntu系统详细过程
- escape()和unescape()函数的使用方法
- android系统的刷机步骤,怎么刷机安卓系统,自己就能刷机的方法,太方便了
- SASE部署及应用场景探讨
- 安卓 NFC 功能使用小结
- 全国大学生数学建模2020A题炉温曲线Matlab代码(后两问)
- 兰州大学计算机专业基地班考试,兰大新生的基地班选拔考试