[关闭]
@Acqua 2019-01-17T12:11:43.000000Z 字数 1432 阅读 997

HDU1540 Tunnel Warfare(Dec. 30th, 2018) 区间合并

线段树

题目来源

题意

给定一个长度为、初始全为1的序列个操作:
1. :将变为0
2. :将上一个被变为0的元素恢复为1
3. :求所在的连续1区间长度

思路

区间合并,但是在查询上遇到了些许困难。

反思

  1. 此次查错耗时过长,需要更新差错算法。
  2. 线段树区间合并基本掌握。

代码

  1. // La Lune
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #define il u << 1
  7. #define el u << 1 | 1
  8. #define lson il, l, mid
  9. #define rson el, mid + 1, r
  10. #define root 1, 1, n
  11. #define morb int u, int l, int r
  12. using namespace std;
  13. const int N = 5e4 + 5;
  14. int lu[N << 2], un[N << 2], ne[N << 2], lune[N];
  15. void pushup(int u, int m){
  16. lu[u] = lu[il];
  17. ne[u] = ne[el];
  18. if(lu[il] == (m - (m >> 1)))
  19. lu[u] += lu[el];
  20. if(ne[el] == (m >> 1))
  21. ne[u] += ne[il];
  22. un[u] = max(ne[il] + lu[el], max(un[il], un[el]));
  23. }
  24. void build(morb){
  25. lu[u] = un[u] = ne[u] = r - l + 1;
  26. if(l == r)
  27. return;
  28. int mid = l + r >> 1;
  29. build(lson);
  30. build(rson);
  31. }
  32. void update(morb, int x, int c){
  33. if(l == r && l == x){
  34. lu[u] = un[u] = ne[u] = c;
  35. return;
  36. }
  37. int mid = l + r >> 1;
  38. if(x <= mid)
  39. update(lson, x, c);
  40. else
  41. update(rson, x, c);
  42. pushup(u, r - l + 1);
  43. }
  44. int query(morb, int x){
  45. if(l == r || un[u] == 0 || un[u] == r - l + 1)
  46. return un[u];
  47. int mid = l + r >> 1;
  48. if(x <= mid){
  49. if(x >= mid - ne[il] + 1)
  50. return query(lson, x) + query(rson, mid + 1);
  51. else
  52. return query(lson, x);
  53. }
  54. else{
  55. if(x <= mid + 1 + lu[el] - 1)
  56. return query(lson, mid) + query(rson, x);
  57. else
  58. return query(rson, x);
  59. }
  60. }
  61. int main(){
  62. int n, q;
  63. while(~scanf("%d %d", &n, &q)){
  64. int t = 0;
  65. build(root);
  66. while(q--){
  67. char c; int pos;
  68. scanf("\n%c ", &c);
  69. if(c == 'D'){
  70. scanf("%d", &pos);
  71. update(root, pos, 0);
  72. lune[++ t] = pos;
  73. }
  74. if(c == 'R'){
  75. if(t > 0)
  76. update(root, lune[t--], 1);
  77. }
  78. if(c == 'Q'){
  79. scanf("%d", &pos);
  80. printf("%d\n", query(root, pos));
  81. }
  82. }
  83. }
  84. return 0;
  85. }

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注