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]楼房重建(线段树)相关推荐

  1. BZOJ 2957楼房重建

    传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...

  2. bzoj 2957: 楼房重建(线段树+递归)

    2957: 楼房重建 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 2778  Solved: 1314 [Submit][Status][Disc ...

  3. [BZOJ 2957]楼房重建(THU2013集训)(线段树维护单调栈)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2957 分析: 根据题意,就是比较斜率大小 只看一段区间的话,那么这段区间能看见的楼房数量就是这 ...

  4. 【BZOJ—2957楼房重建】【连载:请在T台上微笑】

    长久没有发博文了...对对对, 所以最近就趁着暑假多发发吧 颓废是革命的本钱: 推荐一个我喜欢的新连载漫画吧[请在T台上微笑] BZOJ 2957 [楼房重建] Description 小A的楼房外有 ...

  5. P4198 楼房重建 线段树 + 区间合并

    传送门 文章目录 题意: 思路: 题意: 题面有点问题,按照人类正常的理解来就好啦. 思路: 可以想到维护每个位置的一个斜率,模拟的话就是从第一个位置开始向后选,当某个位置斜率大于当前位置的时候,答案 ...

  6. LG P4198 楼房重建(线段树)

    LG P4198 楼房重建 Solution 基础的线段树题,虽然我还不熟练就是了. 大概就是单点修改,求全局的极大子序列. 我们需要维护一个区间最大值aaa和极大子序列长度sss. 合并xxx的左右 ...

  7. BZOJ2957:楼房重建(线段树)

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

  8. BZOJ 2957: 楼房重建

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

  9. bzoj 2957 楼房重建

    http://www.elijahqi.win/archives/3479 Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经 ...

最新文章

  1. 20130717随想
  2. Windows XP解决显示桌面图标消失的问题
  3. Android异常处理——try、catch、finally、throw、throws
  4. 处理异常:org.springframework.beans.factory.BeanNotOfRequiredTypeException
  5. tiny6410裸机实验第0章--------------开发环境的搭建(USB转串口)
  6. STM32旋转立方体
  7. CDD数据库文件制作(一)
  8. 解决ERROR:Local variable count defined in an enclosing scope must be final or effectively final
  9. opencv+python+OpenPose姿态实时识别
  10. android仿微信红包动画,Android仿微信打开红包动画(逐帧动画)
  11. 基因家族的鉴定-基于windows系统上的本地blast
  12. 力扣刷题day42|121买卖股票的最佳时机、122买卖股票的最佳时机II
  13. 2021年国企、银行求职面经汇总(更新中)
  14. 树莓派安装Ubuntu系统详细过程
  15. escape()和unescape()函数的使用方法
  16. android系统的刷机步骤,怎么刷机安卓系统,自己就能刷机的方法,太方便了
  17. SASE部署及应用场景探讨
  18. 安卓 NFC 功能使用小结
  19. 全国大学生数学建模2020A题炉温曲线Matlab代码(后两问)
  20. 兰州大学计算机专业基地班考试,兰大新生的基地班选拔考试

热门文章

  1. centos在线安装mysql
  2. 查看oracle连接客户端
  3. Gitlab7.0通知邮箱的配置(smtp)
  4. 又收集了一个字体图标站
  5. mybatis控制台打印执行的sql语句
  6. linux系统安装细节及磁盘分区划分
  7. 《C++ Primer Plus(第六版)》(13)(第九章 内存模型和命名空间 笔记)
  8. WebView加载html页面
  9. .Net设计模式_原型模式
  10. MSF(六):后渗透