嘟嘟嘟

线段树好题。

其实挺水的,想暴力怎么做:每一次从这个点开始向两边扩,直到遇到第一个摧毁的房屋。

那么把暴力改成倍增,然后线段树查询区间和是否为0。时间复杂度O(nlog2n)。

题解好像有线段树的O(nlogn)的做法,但是特别麻烦,也没怎么看懂。

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cmath>
  4 #include<algorithm>
  5 #include<cstring>
  6 #include<cstdlib>
  7 #include<cctype>
  8 #include<vector>
  9 #include<stack>
 10 #include<queue>
 11 using namespace std;
 12 #define enter puts("")
 13 #define space putchar(' ')
 14 #define Mem(a, x) memset(a, x, sizeof(a))
 15 #define rg register
 16 typedef long long ll;
 17 typedef double db;
 18 const int INF = 0x3f3f3f3f;
 19 const db eps = 1e-8;
 20 const int maxn = 5e4 + 5;
 21 inline ll read()
 22 {
 23   ll ans = 0;
 24   char ch = getchar(), last = ' ';
 25   while(!isdigit(ch)) {last = ch; ch = getchar();}
 26   while(isdigit(ch)) {ans = ans * 10 + ch - '0'; ch = getchar();}
 27   if(last == '-') ans = -ans;
 28   return ans;
 29 }
 30 inline void write(ll x)
 31 {
 32   if(x < 0) x = -x, putchar('-');
 33   if(x >= 10) write(x / 10);
 34   putchar(x % 10 + '0');
 35 }
 36
 37 int n, m;
 38 char c[2];
 39
 40 int l[maxn << 2], r[maxn << 2], sum[maxn << 2];
 41 void build(int L, int R, int now)
 42 {
 43   l[now] = L; r[now] = R;
 44   if(L == R) return;
 45   int mid = (L + R) >> 1;
 46   build(L, mid, now << 1);
 47   build(mid + 1, R, now << 1 | 1);
 48 }
 49 void update(int now, int id, int flg)
 50 {
 51   if(l[now] == r[now]) {sum[now] += flg; return;}
 52   int mid = (l[now] + r[now]) >> 1;
 53   if(id <= mid) update(now << 1, id, flg);
 54   else update(now << 1 | 1, id, flg);
 55   sum[now] = sum[now << 1] + sum[now << 1 | 1];
 56 }
 57 int query(int L, int R, int now)
 58 {
 59   if(l[now] == L && r[now] == R) return sum[now];
 60   int mid = (l[now] + r[now]) >> 1;
 61   if(R <= mid) return query(L, R, now << 1);
 62   else if(L > mid) return query(L, R, now << 1 | 1);
 63   else return query(L, mid, now << 1) + query(mid + 1, R, now << 1 | 1);
 64 }
 65
 66 int solve(int x)
 67 {
 68   if(query(x, x, 1)) return 0;
 69   int ret = 0;
 70   for(int t = x, i = 20; i >= 0; --i)
 71     {
 72       int j = t + (1 << i) - 1;
 73       if(j > n) continue;
 74       if(!query(t, j, 1)) ret += (1 << i), t += (1 << i);
 75     }
 76   for(int t = x, i = 20; i >= 0; --i)
 77     {
 78       int j = t - (1 << i) + 1;
 79       if(j < 1) continue;
 80       if(!query(j, t, 1)) ret += (1 << i), t -= (1 << i);
 81     }
 82   return ret - 1;
 83 }
 84
 85 int st[maxn], top = 0;
 86
 87 int main()
 88 {
 89   n = read(); m = read();
 90   build(1, n, 1);
 91   for(int i = 1; i <= m; ++i)
 92     {
 93       scanf("%s", c);
 94       if(c[0] == 'D')
 95     {
 96       st[++top] = read();
 97       update(1, st[top], 1);
 98     }
 99       else if(c[0] == 'R') update(1, st[top--], -1);
100       else
101     {
102       int x = read();
103       write(solve(x)), enter;
104     }
105     }
106   return 0;
107 }

View Code

转载于:https://www.cnblogs.com/mrclr/p/9841121.html

luogu P1503 鬼子进村相关推荐

  1. 鬼子进村(洛谷 1503)

    题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战. 题目描述 描述 县城里 ...

  2. fhq——treap

    前言 这是分裂平衡树,是范浩强神牛发明的,我觉得是一个好写,好调的平衡树,所以先%fhq 之后开始 原理 其实就是把普通的treap的旋转换成了分裂,于是他就可以实现所有平衡树的所有操作 结构体里的东 ...

  3. IOCP , kqueue , epoll ... 有多重要?

    原文地址:http://blog.codingnow.com/2006/04/iocp_kqueue_epoll.html 设计 mmo 服务器,我听过许多老生常谈,说起处理大量连接时, select ...

  4. Conclusion

    /* 高中最后一个暑假 挺有意义的 考了一暑假的试 最后总结一下吧 一天一天来吧7.30 这一天的题有点变态啊 不过难题有难题的做法 T1斗地主 考试的时候打了0分 0分..... 原因好像是读入的格 ...

  5. 支付系统高可用架构设计实战,可用性高达99.999!

    作者:冯忠旗 来源:juejin.im/post/5cfde01bf265da1bba58f863 一.背景 对于互联网应用和企业大型应用而言,多数都尽可能地要求做到7*24小时不间断运行,而要做到完 ...

  6. 可用性高达99.999%!支付系统高可用架构设计实战

    作者:冯忠旗原文:https://juejin.im/post/5cfde01bf265da1bba58f863 一.背景 对于互联网应用和企业大型应用而言,多数都尽可能地要求做到7*24小时不间断运 ...

  7. 看到腾讯反驳360的文章,笑死我了。

    文章地址:http://tech.qq.com/a/20101031/000073.htm 我在从文章看出一丝酸味与妒忌啊? 腾讯用此:指鹿为马.偷梁换柱,瞒天过海,假痴不颠,借尸还魂. " ...

  8. 《走着瞧》:另类的知青电影

    ■片名:<走着瞧>■导演:李大为 ■主演:文章.白静.岳红 ■发行:北京天寰新宇国际传媒有限公司 ■首映时间: 2009年5月 ■读家:兴安  ■推荐指数★★★☆☆ ■一句话点评:与以往的 ...

  9. 上古时期(大雾)的数据结构pdf

    分块+点分治+Treap byWYCby\ WYCby WYC Part1 分块 概念 就是将nnn个数分成若干个块,然后要处理的时候整块一起的加上局部的直接暴力. 如果将块的大小分配好一般每次都是O ...

最新文章

  1. Android: 启动另外的APP及传递参数(转)
  2. 笔记-计算机网络基础-无线局域网标准IEEE802
  3. 比较简单的在线图像编辑软件:觉得还行
  4. linux-压缩和解压类
  5. 【写作】Texlive和Texmaker学习
  6. java面向对象:关键字 —(17)
  7. asp.net core 使用newtonsoft完美序列化WebApi返回的ValueTuple
  8. 一个优秀的可定制化Flutter相册组件,看这一篇就够了
  9. pyqt5示例_木辛老师的编程课堂:Python和Qt第一讲之初识PyQt5
  10. 男人离婚后一般过得怎么样?
  11. 身为开发人员,这些数据库合知识不掌握不合适!
  12. Java 中的array数组总结之一
  13. Xcode之developer tools access
  14. [Oracle]GoldenGate官方文档
  15. Android P新特性
  16. 程序员为什么要会用Google谷歌搜索引擎
  17. MsXml创建和解析XML示例
  18. AirPods pro 连接Macbook pro左耳无声音
  19. 最大开源代码sourceforge 简介 及视音频方面常用的开源代码
  20. sql/hana批量存入表(每日一总)

热门文章

  1. 《大话设计模式》——外观模式
  2. mysql 乱码解决方案
  3. 3D游戏引擎中常见的三维场景管理方法
  4. 兼容所有浏览器的设为首页收藏本站js代码,推荐使用
  5. centos sudo不能运行_Linux命令su、sudo、sudo su、sudo -i使用和区别
  6. (97)FPGA边沿检测(上升沿检测)
  7. (71)FPGA面试题-使用不同的代码实现2-4译码器?使用case语句
  8. (41)Xilinx MMCM IP核配置(二)(第9天)
  9. (10)System Verilog 关联数组
  10. (1)FPGA面试题Setup和Holdup时间