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)

  1. #include<bits/stdc++.h>
  2. #define il inline
  3. #define vd void
  4. typedef long long ll;
  5. il int gi(){
  6. int x=0,f=1;
  7. char ch=getchar();
  8. while(ch<'0'||ch>'9'){
  9. if(ch=='-')f=-1;
  10. ch=getchar();
  11. }
  12. while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
  13. return x*f;
  14. }
  15. int ans[100010<<2];
  16. double max[100010<<2];
  17. #define mid ((l+r)>>1)
  18. #define ls (x<<1)
  19. #define rs (x<<1|1)
  20. il double calc(int x,int l,int r,double&h){
  21. if(l==r)return max[x]>h;
  22. if(max[ls]<=h)return calc(rs,mid+1,r,h);
  23. else return ans[x]-ans[ls]+calc(ls,l,mid,h);
  24. }
  25. il vd update(int x,int l,int r,int&p,double&h){
  26. if(l==r){max[x]=h;ans[x]=1;return;}
  27. if(p<=mid)update(ls,l,mid,p,h);
  28. else update(rs,mid+1,r,p,h);
  29. max[x]=std::max(max[ls],max[rs]);
  30. if(max[rs]<=max[ls])ans[x]=ans[ls];
  31. else ans[x]=ans[ls]+calc(rs,mid+1,r,max[ls]);
  32. }
  33. int main(){
  34. int n=gi(),m=gi();
  35. for(int i=1;i<=m;++i){
  36. int x=gi();
  37. double y=gi()*1.00/x;
  38. update(1,1,n,x,y);
  39. printf("%d\n",ans[1]);
  40. }
  41. return 0;
  42. }

P4198 楼房重建的更多相关文章

  1. 洛谷P4198 楼房重建 (分块)

    洛谷P4198 楼房重建 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题, ...

  2. 洛谷 P4198 楼房重建 线段树维护单调栈

    P4198 楼房重建 题目链接 https://www.luogu.org/problemnew/show/P4198 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上 ...

  3. luogu题解P4198楼房重建--线段树神操作

    题目链接 https://www.luogu.org/problemnew/show/P4198 分析 一句话题意,一条数轴上有若干楼房,坐标为\(xi\)的楼房有高度\(hi\),那么它的斜率为\( ...

  4. 【题解】Luogu P4198 楼房重建

    原题传送门 根据斜率来建线段树,线段树维护区间最大斜率以及区间内能看见的楼房的数量(不考虑其他地方的原因,两个节点合并时再考虑) 细节见程序 #include <bits/stdc++.h> ...

  5. luogu P4198 楼房重建——线段树

    题目大意: 小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度.如果这栋楼房上任何一个高度大于0的点与(0,0)的连线没有与之前的线 ...

  6. 【洛谷】P4198 楼房重建

    题解 我们转而维护每个点的斜率,显然一个楼房能被看见它就是一个前缀最大值,斜率比较为了节约精度可以用向量替代 我们每个区间维护被看到的楼房的个数,和楼房的最大值,叶子节点在有楼房时,值为1 那么考虑合 ...

  7. [Luogu P4198]楼房重建(线段树)

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

  8. [Luogu] P4198 楼房重建

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

  9. 洛谷 P4198 楼房重建 题解

    题面 首先你要知道题问的是什么:使用一种数据结构,动态地维护以1为起点地最长上升子序列(把楼房的高度转化成斜率地序列)的长度: 怎么做?线段树! 我们在线段树上维护两个东西:1.这个区间内斜率的最大值 ...

随机推荐

  1. ext button 属性

    var buttonName = new Ext.Button({               id:"buttonName",               text:" ...

  2. Error loading XML document: dwz.frag.xml 处理方式

    问题:直接用IE打开index.html弹出一个对话框:Error loading XML document: dwz.frag.xml 方案一(已经验证): 转自:http://blog.csdn. ...

  3. UNIX高级环境编程(9)进程控制(Process Control)- fork,vfork,僵尸进程,wait和waitpid

    本章包含内容有: 创建新进程 程序执行(program execution) 进程终止(process termination) 进程的各种ID   1 进程标识符(Process Identifie ...

  4. CSS学习摘要-数值和单位及颜色

    在CSS中,值的类型有很多种,一些很常见,一些你却几乎没怎么遇到过.我们不会在这篇文档中面面俱到地描述他们,而只是这些对于掌握CSS可能最有用处的这些.本文将会涉及如下CSS的值: 数值: 长度值,用 ...

  5. 第二次作业:找Bug

    引子 我真的想了一个小时,上哪里去找bug.我昨天还留意到一个bug,今天就不见了.灵光不断,我想起来了.我就要找大公司的产品的bug... 第一部分 调研, 评测 体验. <腾讯桌球>是 ...

  6. 【问题记录】python 函数 传入一个对象返回一个对象值得注意

    写了一个函数,这个函数接收一个参数,在函数里面判断这个参数是否为None或者不合法状态, 如果处于不合法状态,则创建一个对象返回, 如果合法直接返回 代码示例如下: def get_mq_connec ...

  7. UVa 10213 - How Many Pieces of Land ?(欧拉公式)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. hacknet

    网盘下载地址,下载后cmd运行hacknet.exe 链接:https://pan.baidu.com/s/1gTrcuDRzDhepFlXhsOMVlg 提取码:os9v 经过5个小时的战斗,终于通 ...

  9. Java基础加强之反射

    1.什么是反射? 反射其实就是动态的加载类,我们在写JDBC的时候加载驱动Class.forName("xxx")时就涉及到了反射. 反射机制是在运行状态中,对于任意一个类,都能够 ...

  10. net::ERR_CONNECTION_RESET 报错原因

    1>  向tomcat 服务器上上传视频, 谷歌浏览器控制台报出: 打开信地址栏后 发现: net::ERR_CONNECTION_RESET 错误, 但是此视频以经过mp4转码(注: 浏览器支 ...