题解:

考虑用线段树维护楼的最大值,然后这个问题就很简单了。

每次可以向左二分出比x高的第一个楼a,同理也可以向右二分出另一个楼b,如果a,b都存在,答案就是b-a-1。

注意到二分是可以直接在线段树上进行的,所以复杂度是O(nlogn)。

当然这里是用分块做的,更暴力一些。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. using namespace std;
  6. const int maxn = 1e5 + , maxN = ;
  7. int B[maxN], Tag[maxN];
  8. int a[maxn];
  9. int n, m, N, L;
  10. void Update(int i){
  11. if(Tag[i] == -) return;
  12. int bl = i*L, br = min(n, (i+)*L-);
  13. for(int j = bl; j <= br; j++) a[j] = Tag[i];
  14. Tag[i] = -;
  15. }
  16. void Change(int l, int r, int v){
  17. for(int i = ; i < N; i++){
  18. int bl = i*L, br = min(n, (i+)*L-);
  19. if(l <= bl && br <= r){
  20. Tag[i] = v;
  21. B[i] = v;
  22. } else if(bl <= l && l <= br && bl <= r && r <= br){
  23. Update(i);
  24. B[i] = max(B[i], v);
  25. for(int j = l; j <= r; j++) a[j] = v;
  26. } else if(bl <= l && l <= br){
  27. Update(i);
  28. B[i] = max(B[i], v);
  29. for(int j = l; j <= br; j++) a[j] = v;
  30. } else if(bl <= r && r <= br){
  31. Update(i);
  32. B[i] = max(B[i], v);
  33. for(int j = bl; j <= r; j++) a[j] = v;
  34. }
  35. }
  36. }
  37.  
  38. int Findl(int x){
  39. int bi = x/L;
  40. int bl = bi*L, br = min(n, (bi+)*L-);
  41. Update(bi);
  42. for(int i = x-; i >= bl; i--){
  43. if(a[i] > a[x]) return i;
  44. }
  45. for(int i = bi-; i >= ; i--){
  46. if(B[i] > a[x]){
  47. bl = i*L, br = min(n, (i+)*L-);
  48. Update(i);
  49. for(int j = br; j >= bl; j--)
  50. if(a[j] > a[x]) return j;
  51. }
  52. }
  53. return -;
  54. }
  55.  
  56. int Findr(int x){
  57. int bi = x/L;
  58. int bl = bi*L, br = min(n, (bi+)*L-);
  59. Update(bi);
  60. for(int i = x+; i <= br; i++){
  61. if(a[i] > a[x]) return i;
  62. }
  63. for(int i = bi+; i < N; i++){
  64. if(B[i] > a[x]){
  65. bl = i*L, br = min(n, (i+)*L-);
  66. Update(i);
  67. for(int j = bl; j <= br; j++)
  68. if(a[j] > a[x]) return j;
  69. }
  70. }
  71. return -;
  72. }
  73.  
  74. int main()
  75. {
  76. int x, y, z;
  77. cin>>n;
  78. for(int i = ; i <= n; i++){
  79. scanf("%d", &a[i]);
  80. }
  81. L = sqrt(n+0.5);
  82. N = n/L + ;
  83. for(int i = ; i < N; i++) Tag[i] = -;
  84. for(int i = ; i <= n; i++){
  85. B[i/L] = max(B[i/L], a[i]);
  86. }
  87. cin>>m;
  88. for(int i = ; i <= m; i++){
  89. scanf("%d", &x);
  90. if(x == ){
  91. scanf("%d %d %d", &x, &y, &z);
  92. Change(x, y, z);
  93. } else {
  94. scanf("%d", &x);
  95. int l = Findl(x), r = Findr(x);
  96. if(l == - || r == -) printf("-1\n");
  97. else printf("%d\n", r-l-);
  98. }
  99. }
  100. }

计蒜客16492 building(二分线段树/分块)的更多相关文章

  1. 【原创】tyvj1038 忠诚 & 计蒜客 管家的忠诚 & 线段树(单点更新,区间查询)

    最简单的线段树之一,中文题目,不翻译.... 注释讲的比较少,这已经是最简单的线段树,如果看不懂真的说明最基础的理论没明白 推荐一篇文章http://www.cnblogs.com/liwenchi/ ...

  2. [计蒜客T2238]礼物_线段树_归并排序_概率期望

    礼物 题目大意: 数据范围: 题解: 这题有意思啊($md$卡常 直接做怎么做? 随便上个什么东西,维护一下矩阵乘和插入,比如说常数还算小的$KD-Tree$(反正我是没见人过过 我们漏掉了一个条件, ...

  3. 计蒜客 28315.Excellent Engineers-线段树(单点更新、区间最值) (Benelux Algorithm Programming Contest 2014 Final ACM-ICPC Asia Training League 暑假第一阶段第二场 E)

    先写这几道题,比赛的时候有事就只签了个到. 题目传送门 E. Excellent Engineers 传送门 这个题的意思就是如果一个人的r1,r2,r3中的某一个比已存在的人中的小,就把这个人添加到 ...

  4. 计蒜客 38228. Max answer-线段树维护单调栈(The Preliminary Contest for ICPC China Nanchang National Invitational I. Max answer 南昌邀请赛网络赛) 2019ICPC南昌邀请赛网络赛

    Max answer Alice has a magic array. She suggests that the value of a interval is equal to the sum of ...

  5. 计蒜客 41391.query-二维偏序+树状数组(预处理出来满足情况的gcd) (The Preliminary Contest for ICPC Asia Xuzhou 2019 I.) 2019年徐州网络赛)

    query Given a permutation pp of length nn, you are asked to answer mm queries, each query can be rep ...

  6. 计蒜客 Prefix Free Code(字典树+树状数组)

    Consider n initial strings of lower case letters, where no initial string is a prefix of any other i ...

  7. [计蒜客] 矿石采集【记搜、Tarjan缩点+期望Dp】

    Online Judge:计蒜客信息学3月提高组模拟赛 Label:记搜,TarJan缩点,树状数组,期望Dp 题解 整个题目由毫无关联的两个问题组合成: part1 问题:对于每个询问的起点终点,求 ...

  8. 计蒜客 NOIP 提高组模拟竞赛第一试 补记

    计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...

  9. 计蒜客 28449.算个欧拉函数给大家助助兴-大数的因子个数 (HDU5649.DZY Loves Sorting) ( ACM训练联盟周赛 G)

    ACM训练联盟周赛 这一场有几个数据结构的题,但是自己太菜,不会树套树,带插入的区间第K小-替罪羊套函数式线段树, 先立个flag,BZOJ3065: 带插入区间K小值 计蒜客 Zeratul与Xor ...

随机推荐

  1. Linux基础(04)、功能配置(调整防火墙、静态IP、环境变量)

    目录 一.centos防火墙 二.VMware网络连接方式 2.1.连接方式:桥接.NAT.仅主机 2.2.常见问题 三.centos配置静态IP 四.环境变量 4.1.什么是环境变量 4.2.临时修 ...

  2. QP之QEP原理

    1.QP简介: 量子平台(Quantum Platform, 简称QP)是一个用于实时嵌入式系统的软件框架,QP是轻量级的.开源的.基于层次式状态机的.事件驱动的平台. QP包括事件处理器(QEP). ...

  3. python的基本知识,range在python2.x中和python3.x中的区别

    这些是最开始学习python时的笔记,今天整理一下,在这里记录一下. 各种基础代码解释 for key,item in enumerate(li): print(key,item) inp=input ...

  4. IO复用——poll系统调用

    1.poll函数 #include<poll.h> int poll(struct pollfd* fds, nfds_t ndfs, int timeout) poll函数在一定的时间内 ...

  5. 【POJ】1008 Maya Calendar

    参考:https://blog.csdn.net/u011392408/article/details/28866779 https://blog.csdn.net/qq_36424540/artic ...

  6. 【TRICK】[0,n)中所有大小为k的子集的方法

    << k) - ; <<n)) { int x = comb & -comb, y = comb + x; comb = (((comb & ~y)/x)> ...

  7. shell -- sed用法

    sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为:         sed ...

  8. Bug是一种财富-------研发同学的错题集、测试同学的遗漏用例集

    此文已由作者王晓明授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 各位看官,可能看到标题的你一定认为这是一篇涉嫌"炒作"的文章,亦或是为了吸引眼球而起的标 ...

  9. 【数据库】 SQL 常用语句之系统语法

    [数据库] SQL 常用语句之系统语法 1. 获取取数据库服务器上所有数据库的名字 SELECT name FROM master.dbo.sysdatabases 2. 获取取数据库服务器上所有非系 ...

  10. 【连载】Bootstrap开发漂亮的前端界面之自定义右键菜单

    连载: 1<教你用Bootstrap开发漂亮的前端界面> 2.<Bootstrap开发漂亮的前端界面之实现原理> 网页中的自定义右键菜单越来越普遍,自定义右键菜单可以增强用户体 ...