http://www.cnblogs.com/wmrv587/p/3843681.html

ORZ 分块大爷。思路很神奇也很清晰。

把 块内最值 和 块内有序 两种良好的性质结合起来,非常棒地解决了这个问题。

图中黑色的楼房即为每个块内的“可视序列”,显而易见,在块内它们的K(斜率)是单增的。

由于上图中第一个块的maxK比后面两个块的maxK都要大,所以后两个块对答案没有贡献,这也是显然的。这就是维护maxK的意义所在。

否则,若一个块可以更新maxK的话,则其中的部分楼房是“可见的”,具体来说,就是在那个比之前的maxK要大的楼房的后面的在可视序列中的楼房数。<---请从方链接看原版题解。

另外,并不会像他说的,基本不会T,如果把块大小开得合适。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<vector>
  4. #include<cmath>
  5. #include<cstring>
  6. using namespace std;
  7. inline double max(const double &a,const double &b){return a>b?a:b;}
  8. vector<double>See[];
  9. double k[];
  10. int sz,sum,l[],r[],num[],n,m,x,y;
  11. double maxv[];
  12. int Res,Num;char C,CH[];
  13. inline int G()
  14. {
  15. Res=;C='*';
  16. while(C<''||C>'')C=getchar();
  17. while(C>=''&&C<=''){Res=Res*+(C-'');C=getchar();}
  18. return Res;
  19. }
  20. inline void P(int x)
  21. {
  22. Num=;if(!x){putchar('');puts("");return;}
  23. while(x>)CH[++Num]=x%,x/=;
  24. while(Num)putchar(CH[Num--]+);
  25. puts("");
  26. }
  27. void makeblock()
  28. {
  29. memset(maxv,,sizeof(maxv));
  30. sz=sqrt((double)n*1.05);
  31. for(sum=;sum*sz<n;sum++)
  32. {
  33. l[sum]=(sum-)*sz+;
  34. r[sum]=sum*sz;
  35. for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
  36. }
  37. l[sum]=sz*(sum-)+;
  38. r[sum]=n;
  39. for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
  40. }
  41. inline void update()
  42. {
  43. k[x]=(double)y/x;
  44. See[num[x]].clear();
  45. maxv[num[x]]=0.0;
  46. for(int i=l[num[x]];i<=r[num[x]];i++)
  47. if(k[i]>maxv[num[x]])
  48. {
  49. maxv[num[x]]=k[i];
  50. See[num[x]].push_back(k[i]);
  51. }
  52. }
  53. inline void query()
  54. {
  55. int ans=;double tmp=0.0;
  56. for(int i=;i<=sum;i++)
  57. if(!See[i].empty())
  58. {
  59. ans+=See[i].end()-upper_bound(See[i].begin(),See[i].end(),tmp);
  60. tmp=max(tmp,maxv[i]);
  61. }
  62. P(ans);
  63. }
  64. int main()
  65. {
  66. n=G();m=G();makeblock();
  67. for(int i=;i<=m;i++){x=G();y=G();update();query();}
  68. return ;
  69. }

【分块】bzoj2957 楼房重建的更多相关文章

  1. BZOJ2957: 楼房重建(线段树&LIS)

    2957: 楼房重建 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 3727  Solved: 1793[Submit][Status][Discus ...

  2. BZOJ2957: 楼房重建(分块)

    题意 题目链接 Sol 自己YY出了一个\(n \sqrt{n} \log n\)的辣鸡做法没想到还能过.. 可以直接对序列分块,我们记第\(i\)个位置的值为\(a[i] = \frac{H_i}{ ...

  3. (分块)楼房重建 HYSBZ - 2957

    题意 长度为n的坐标轴上,从1-n上的每一点都有一栋楼房,楼房的初识高度都为0,每一天都有一栋楼房的高度被修改(也可以不变),一栋楼房能被看见当且仅当其最高点与远点的连线不会与其他之前连线相交,问你每 ...

  4. Bzoj2957 楼房重建

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

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

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

  6. 【数据结构】bzoj2957楼房重建

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

  7. 【经典问题】bzoj2957: 楼房重建

    经典问题:动态维护上升子序列长度 进阶问题:[经典问题]#176. 栈 Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无 ...

  8. BZOJ2957 楼房重建 【线段树】

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

  9. bzoj2957 楼房重建——线段树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2957 线段树维护两个值:cnt 能看到的最多楼房数: mx 最大斜率数: 对于一段区间,从左 ...

随机推荐

  1. c++(类继承)示例[仅用于弱弱的博主巩固知识点用哦,不好勿喷]

    测试代码: Animals.h: #pragma once #include<string> class Animals { protected: std::string Food; in ...

  2. es6+最佳入门实践(8)

    8.Promise 8.1.什么是异步? 要理解异步,首先,从同步代码开始说 alert(1) alert(2) 像上面的代码,执行顺序是从上到下,先后弹出1和2,这种代码叫做同步代码 alert(0 ...

  3. flume高级组件及各种报错

    1,one source two channel 创建conf文件,内容如下: #定义agent名, source.channel.sink的名称 access.sources = r1 access ...

  4. BZOJ 4514: [Sdoi2016]数字配对

    4514: [Sdoi2016]数字配对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1606  Solved: 608[Submit][Statu ...

  5. MINA 网络黏包处理代码

    本文完整代码,可以浏览: https://github.com/hjj2017/xgame-code_server/blob/master/game_server/src/com/game/gameS ...

  6. 类似web风格的 Winform 分页控件

    背景 最近做一个Winform的小程序,需要用到分页,由于之前一直在用 TonyPagerForWinForm.dll ,但该库没有源代码,网上找的也不全面,索性就准备自己改造一个.在园子里翻了一下, ...

  7. bzoj 1150 贪心

    首先选取的线段一定是相邻两个端点线段,那么我们贪心的考虑这个问题,我们先在这n-1条线段中选出最短的一条,然后将这条线段的值改为左面的线段的值+右面的线段的值-自己的值,用这条线段取代原来这三条线段, ...

  8. sphinx 分词搭建手册

    步奏1. yum install make gcc g++ gcc-c++ libtool autoconf automake imake mysql-devel libxml2-devel expa ...

  9. HDU1284 钱币兑换问题

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  10. ARM 中断状态和SVC状态的堆栈切换 (异常)【转】

    转自:http://blog.csdn.net/edwardlulinux/article/details/9261393 版权声明:本文为博主原创文章,未经博主允许不得转载. ARM 中断状态和SV ...