题目描述

离散化,线段树维护区间修改,发现询问都是单点的\(max\),不妨把标记留在点上,不用下传,查询时取个\(max\)就可以了

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<map>
  6. #define lc (p<<1)
  7. #define rc (p<<1|1)
  8. using namespace std;
  9. const int MAXN=400010;
  10. const int MAXM=1600010;
  11. inline int read(){
  12. int x=0,f=1; char c=getchar();
  13. while(c<'0'){ if(c=='-') f=-1; c=getchar(); }
  14. while(c>='0') x=x*10+c-'0',c=getchar();
  15. return x*f;
  16. }
  17. int n,x[MAXN],cnt,num;
  18. struct Data{
  19. int l,r,h;
  20. } a[MAXN];
  21. map<int,int> Map;
  22. int tree[MAXM],rev[MAXN];
  23. inline void update(int L,int R,int h,int p=1,int l=1,int r=num){
  24. if(L<=l&&r<=R){
  25. tree[p]=max(tree[p],h);
  26. return;
  27. }
  28. int mid=(l+r)>>1;
  29. if(L<=mid) update(L,R,h,lc,l,mid);
  30. if(R>mid) update(L,R,h,rc,mid+1,r);
  31. }
  32. inline int query(int x,int p=1,int l=1,int r=num){
  33. if(l==r) return tree[p];
  34. int mid=(l+r)>>1,ans=tree[p];
  35. if(x<=mid) ans=max(ans,query(x,lc,l,mid));
  36. else ans=max(ans,query(x,rc,mid+1,r));
  37. return ans;
  38. }
  39. inline bool cmp(Data x,Data y){
  40. if(x.l!=y.l)
  41. return x.l<y.l;
  42. return x.r<y.r;
  43. }
  44. int ansx[MAXN],ansy[MAXN],ansnum;
  45. int main(){
  46. n=read();
  47. for(int i=1;i<=n;++i)
  48. a[i].h=read(),a[i].l=read(),a[i].r=read(),--a[i].r;
  49. sort(a+1,a+1+n,cmp);
  50. for(int i=1;i<=n;++i){
  51. x[++cnt]=a[i].l;
  52. x[++cnt]=a[i].l+1;
  53. x[++cnt]=a[i].r;
  54. x[++cnt]=a[i].r+1;
  55. }
  56. x[0]=x[1]-1;
  57. sort(x+1,x+1+cnt);
  58. for(int i=1;i<=cnt;++i)
  59. if(x[i]!=x[i-1]) Map[x[i]]=++num,rev[num]=x[i];
  60. ++num;
  61. for(int i=1;i<=n;++i)
  62. update(Map[a[i].l],Map[a[i].r],a[i].h);
  63. int last=0;
  64. for(int i=1;i<=num;++i){
  65. int tmp=query(i);
  66. if(tmp!=last){
  67. if(tmp>last){
  68. ansx[++ansnum]=rev[i],ansy[ansnum]=last;
  69. ansx[++ansnum]=rev[i],ansy[ansnum]=tmp;
  70. }
  71. else{
  72. ansx[++ansnum]=rev[i-1]+1,ansy[ansnum]=last;
  73. ansx[++ansnum]=rev[i-1]+1,ansy[ansnum]=tmp;
  74. }
  75. last=tmp;
  76. }
  77. }
  78. printf("%d\n",ansnum);
  79. for(int i=1;i<=ansnum;++i)
  80. printf("%d %d\n",ansx[i],ansy[i]);
  81. return 0;
  82. }

【luoguP1382】楼房的更多相关文章

  1. AC日记——楼房 codevs 2995

    2995 楼房  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 地平线(x轴)上有n个矩(lou ...

  2. Bzoj2957 楼房重建

    Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1516  Solved: 723[Submit][Status][Discuss] Descripti ...

  3. 【清华集训】楼房重建 BZOJ 2957

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

  4. 扫描线+堆 codevs 2995 楼房

    2995 楼房  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 地平线(x轴)上有n个矩(lou)形(fan ...

  5. BZOJ 2957 楼房重建

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

  6. [BZOJ 2957]楼房重建(THU2013集训)(分块思想)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2957 分析: 首先明确问题,对于每栋楼房的斜率K=H/X,问题就是问有多少个楼房的K比前面所有 ...

  7. bzoj 2957: 楼房重建 线段树

    2957: 楼房重建 Time Limit: 10 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 小A的楼房外有一大片施 ...

  8. [bzoj2957][楼房重建] (线段树)

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

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

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

随机推荐

  1. Nginx php上传文件大小的设置

  2. Python '\r', '\n', '\r\n' 的彻底理解

    回车和换行的历史: 机械打字机有回车和换行两个键作用分别是: 换行就是把滚筒卷一格,不改变水平位置.   (即移到下一行,但不是行首,而是和上一行水平位置一样) 回车就是把水平位置复位,不卷动滚筒.  ...

  3. JVM 的垃圾回收器详解

    Parallel Scavenge(Paraller):Parallel Scavenge和ParNew关注的点不一样:ParNew关注的是尽可能缩短暂停的时间,Parallel Scavenge关注 ...

  4. Java 8——日期时间工具库(java.time)

    一.前言 在介绍Java SE 8中新的日期时间库前,先了解下Java 8之前的日期时间工具的诟病. 在Java SE 8前,日期时间工具库在java.util包中,包括: java.util.Dat ...

  5. ionic4 页面跳转传值和新页面取值

    页面跳转 : <ion-row *ngFor="let item of aboutData.stockData" [routerLink]="[ '/stock-d ...

  6. angularJS 在edge浏览器上传文件,无法主动触发ng-click

    今天发现的问题 在谷歌浏览器一直运行良好的功能,在edge浏览器不能使用. 代码参考我的另一篇博客:WebAPI Angularjs 上传文件 不能运行的原因 下图红框中的代码在edge浏览器中无法执 ...

  7. Bootstrap4后台导航栏制作

    <!Doctype html> <html lang="zh-cn"> <head> <!-- Required meta tags -- ...

  8. Git分支和版本回退

    一.分支 1.分支简单介绍 简单使用: 可以将git branch new_branch和git checkout new_branch两个命令合并成一个命令: git checkout -b new ...

  9. join 和子查询优化

    一次在家查看数据的时候,列表展示特别慢,就查看了一下,把sql语句拿出来运行居然要4,5秒,当时就感觉有问题,语句用的join链接2个表,感觉没啥错误,为啥会这么慢,然后改用了子查询链接,发现快了许多 ...

  10. 10. Javascript 前后端数据加密

    为了加强项目的接口安全程度,需求如下 var options = { // 前端需要传送的数据加密 data: { abc: 123, bcd: 123, cds: '撒旦教付货款12313', }, ...