LOJ#3033. 「JOISC 2019 Day2」两个天线

用后面的天线更新前面的天线,线段树上存历史版本的最大值

也就是线段树需要维护历史版本的最大值,后面的天线的标记中最大的那个和最小的那个,区间中最小的可用天线值,区间中最大的可用天线值

\(i\)可以被\(j\)用到,那么\(j\)在\([i + A_{i},i + B_{i}]\)中,我们枚举右端点的时候,假如到了\(i + A_{i}\)就把\(i\)标记为可用,如果到了\(i + B_{i} + 1\)就把\(i\)标记为不可用

然后枚举右端点,对于一个新加的端点,现在线段树中区间\([i - B_{i},i- A_{i}]\)是可用的,所以我们需要给这个区间打上标记

然后对于一个询问到了对应的右端点,只需要查找区间中历史版本的最大值就好了

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define mp make_pair
  6. #define pb push_back
  7. #define space putchar(' ')
  8. #define enter putchar('\n')
  9. #define eps 1e-10
  10. #define MAXN 200005
  11. #define ba 47
  12. //#define ivorysi
  13. using namespace std;
  14. typedef long long int64;
  15. typedef unsigned int u32;
  16. typedef double db;
  17. template<class T>
  18. void read(T &res) {
  19. res = 0;T f = 1;char c = getchar();
  20. while(c < '0' || c > '9') {
  21. if(c == '-') f = -1;
  22. c = getchar();
  23. }
  24. while(c >= '0' && c <= '9') {
  25. res = res * 10 +c - '0';
  26. c = getchar();
  27. }
  28. res *= f;
  29. }
  30. template<class T>
  31. void out(T x) {
  32. if(x < 0) {x = -x;putchar('-');}
  33. if(x >= 10) {
  34. out(x / 10);
  35. }
  36. putchar('0' + x % 10);
  37. }
  38. struct node {
  39. int l,r,mn,mx,lzmn,lzmx,oldmx;
  40. }tr[MAXN * 4];
  41. int N,Q,H[MAXN],A[MAXN],B[MAXN],ans[MAXN];
  42. int ql[MAXN],qr[MAXN];
  43. vector<int> ed[MAXN],st[MAXN],qe[MAXN];
  44. void update(int u) {
  45. tr[u].mn = min(tr[u << 1].mn,tr[u << 1 | 1].mn);
  46. tr[u].mx = max(tr[u << 1].mx,tr[u << 1 | 1].mx);
  47. tr[u].oldmx = max(tr[u << 1].oldmx,tr[u << 1 | 1].oldmx);
  48. }
  49. void addlz(int u,int v) {
  50. tr[u].oldmx = max(tr[u].oldmx,v - tr[u].mn);
  51. tr[u].oldmx = max(tr[u].oldmx,tr[u].mx - v);
  52. tr[u].lzmn = min(v,tr[u].lzmn);
  53. tr[u].lzmx = max(v,tr[u].lzmx);
  54. }
  55. void pushdown(int u) {
  56. if(tr[u].lzmn <= 1e9) {
  57. addlz(u << 1,tr[u].lzmn);
  58. addlz(u << 1 | 1,tr[u].lzmn);
  59. tr[u].lzmn = 2e9;
  60. }
  61. if(tr[u].lzmx > 0) {
  62. addlz(u << 1,tr[u].lzmx);
  63. addlz(u << 1 | 1,tr[u].lzmx);
  64. tr[u].lzmx = 0;
  65. }
  66. }
  67. void build(int u,int l,int r) {
  68. tr[u].l = l;tr[u].r = r;
  69. tr[u].mn = 1e9 + 1,tr[u].mx = 0;
  70. tr[u].lzmn = 2e9;tr[u].lzmx = 0;tr[u].oldmx = -1;
  71. if(l == r) return;
  72. int mid = (l + r) >> 1;
  73. build(u << 1,l,mid);
  74. build(u << 1 | 1,mid + 1,r);
  75. }
  76. void change(int u,int pos,int op) {
  77. if(tr[u].l == tr[u].r) {
  78. if(op == 1) tr[u].mn = tr[u].mx = H[pos];
  79. else {
  80. tr[u].mn = 1e9 + 1,tr[u].mx = 0;
  81. }
  82. return;
  83. }
  84. pushdown(u);
  85. int mid = (tr[u].l + tr[u].r) >> 1;
  86. if(pos <= mid) change(u << 1,pos,op);
  87. else if(pos > mid) change(u << 1 | 1,pos,op);
  88. update(u);
  89. }
  90. void add(int u,int l,int r,int v) {
  91. if(tr[u].l == l && tr[u].r == r) {
  92. addlz(u,v);return;
  93. }
  94. pushdown(u);
  95. int mid = (tr[u].l + tr[u].r) >> 1;
  96. if(r <= mid) add(u << 1,l,r,v);
  97. else if(l > mid) add(u << 1 | 1,l,r,v);
  98. else {add(u << 1,l,mid,v);add(u << 1 | 1,mid + 1,r,v);}
  99. update(u);
  100. }
  101. int Query(int u,int l,int r) {
  102. if(tr[u].l == l && tr[u].r == r) return tr[u].oldmx;
  103. int mid = (tr[u].l + tr[u].r) >> 1;
  104. pushdown(u);
  105. if(r <= mid) return Query(u << 1,l,r);
  106. else if(l > mid) return Query(u << 1 | 1,l,r);
  107. else {return max(Query(u << 1,l,mid),Query(u << 1 | 1,mid + 1,r));}
  108. }
  109. void Solve() {
  110. read(N);
  111. for(int i = 1 ; i <= N ; ++i) {
  112. read(H[i]);read(A[i]);read(B[i]);
  113. int l = i + A[i],r = min(i + B[i],N);
  114. if(l <= r) {st[l].pb(i),ed[r + 1].pb(i);}
  115. }
  116. read(Q);
  117. for(int i = 1 ; i <= Q ; ++i) {
  118. read(ql[i]);read(qr[i]);
  119. qe[qr[i]].pb(i);
  120. }
  121. build(1,1,N);
  122. for(int i = 1 ; i <= N ; ++i) {
  123. for(auto t : st[i]) change(1,t,1);
  124. for(auto t : ed[i]) change(1,t,-1);
  125. int l = i - B[i],r = i - A[i];
  126. l = max(l,1);
  127. if(l <= r) add(1,l,r,H[i]);
  128. for(auto id : qe[i]) {
  129. ans[id] = Query(1,ql[id],qr[id]);
  130. }
  131. }
  132. for(int i = 1 ; i <= Q ; ++i) {
  133. out(ans[i]);enter;
  134. }
  135. }
  136. int main() {
  137. #ifdef ivorysi
  138. freopen("f1.in","r",stdin);
  139. #endif
  140. Solve();
  141. }

【LOJ】#3033. 「JOISC 2019 Day2」两个天线的更多相关文章

  1. 【LOJ】#3034. 「JOISC 2019 Day2」两道料理

    LOJ#3034. 「JOISC 2019 Day2」两道料理 找出最大的\(y_{i}\)使得\(sumA_{i} + sumB_{y_i} \leq S_{i}\) 和最大的\(x_{j}\)使得 ...

  2. LOJ#2882. 「JOISC 2014 Day4」两个人的星座(计算几何)

    题面 传送门 题解 我们发现如果两个三角形相离,那么这两个三角形一定存在两条公切线 那么我们可以\(O(n^2)\)枚举其中一条公切线,然后可以暴力\(O(n^3)\)计算 怎么优化呢?我们可以枚举一 ...

  3. @loj - 3039@ 「JOISC 2019 Day4」蛋糕拼接 3

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 今天是 IOI 酱的生日,所以她的哥哥 JOI 君给她预定了一个 ...

  4. LOJ #2877. 「JOISC 2014 Day2」交朋友 并查集+BFS

    这种图论问题都挺考验小思维的. 首先,我们把从 $x$ 连出去两条边的都合并了. 然后再去合并从 $x$ 连出去一条原有边与一条新边的情况. 第一种情况直接枚举就行,第二种情况来一个多源 bfs 即可 ...

  5. LOJ #2876. 「JOISC 2014 Day2」水壶 BFS+最小生成树+倍增LCA

    非常好的一道图论问题. 显然,我们要求城市间的最小生成树,然后查询路径最大值. 然后我们有一个非常神的处理方法:进行多源 BFS,处理出每一个城市的管辖范围. 显然,如果两个城市的管辖范围没有交集的话 ...

  6. [LOJ#2878]. 「JOISC 2014 Day2」邮戳拉力赛[括号序列dp]

    题意 题目链接 分析 如果走到了下行车站就一定会在前面的某个车站走回上行车站,可以看成是一对括号. 我们要求的就是 类似 代价最小的括号序列匹配问题,定义 f(i,j) 表示到 i 有 j 个左括号没 ...

  7. 【LOJ】#3036. 「JOISC 2019 Day3」指定城市

    LOJ#3036. 「JOISC 2019 Day3」指定城市 一个点的可以dp出来 两个点也可以dp出来 后面的就是在两个点的情况下选一条最长的链加进去,用线段树维护即可 #include < ...

  8. 【LOJ】#3031. 「JOISC 2019 Day1」聚会

    LOJ#3031. 「JOISC 2019 Day1」聚会 听说随机可过? 我想了很久想了一个不会被卡的做法,建出前\(u - 1\)个点的虚树,然后找第\(u\)个点的插入位置,就是每次找一条最长链 ...

  9. 【LOJ】#3030. 「JOISC 2019 Day1」考试

    LOJ#3030. 「JOISC 2019 Day1」考试 看起来求一个奇怪图形(两条和坐标轴平行的线被切掉了一个角)内包括的点个数 too naive! 首先熟练的转化求不被这个图形包含的个数 -- ...

随机推荐

  1. 【csp模拟赛3】组合数学

    思路: 先排序,取最大的在剩余左边任意找k-1个数,所以是排列组合,费马小定理求逆元,预处理阶乘,注意要取模.. 代码: #include<cstdio> #include<iost ...

  2. Multiism四阶巴特沃兹低通滤波器的仿真实现

    因为4阶巴特沃兹低通滤波器比较简单,所以省略设计过程和思路以及不必要的废话. 设计的滤波器的性能:截止频率大约是500HKZ,Rs = Rl = 32 欧姆. 预估滤波器大致的幅频特性曲线如下: 最初 ...

  3. 图文并茂VLAN详解,让你看一遍就理解VLAN

    一.为什么需要VLAN 1.1.什么是VLAN? VLAN(Virtual LAN),翻译成中文是“虚拟局域网”.LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络.V ...

  4. python_re模块

    正则表达式:http://www.regexlab.com/zh/regref.htm

  5. JS广度优先查找无向无权图两点间最短路径

    广度优先查找无向无权图两点间最短路径,可以将图看成是以起点为根节点的树状图,每一层是上一层的子节点,一层一层的查找,直到找到目标节点为止. 起点为0度,与之相邻的节点为1度,以此类推. // 广度优先 ...

  6. JS高级_变量提升和函数提升

    先执行变量提升,后执行函数提升 function a(){} var a console.log(typeof a)//function

  7. mysql 创建++删除 数据库

    创建RUNOOB数据库,并设定编码集为utf8 CREATE DATABASE IF NOT EXISTS RUNOOB DEFAULT CHARSET utf8 COLLATE utf8_gener ...

  8. CCF 2017 09-02 公共钥匙盒

     CCF 2017 09-02 公共钥匙盒 1.用快速排序函数结合排序规则函数来给取放排序. 2.vector数组的强大功能. #include<iostream> #include< ...

  9. usage memcache in linux

    set和add的区别 set可以重写存在的键值对, 也可以添加新的/ 而add不行, 如果存在已有的键名, 则add不会做更新该键值对, 不做任何事, 就是一次无效操作, 也就是, add可以防止重写 ...

  10. easyUI之Messager(消息窗口)

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...