Q - Play With Sequence

HDU - 3971

这个题目是一个线段树,比较特别的线段树,就是c询问一定次数之后重新排序建树来优化减低复杂度。

第一次碰到这种题目有点迷。

这个题目写还是很好写的,就是重新排序建树的位置不太好找。

不过可以知道的是,这是更新花费时间和排序花费时间的一个平衡,这个是一个二次函数,这个二次函数的最低点可以自己测出来。

现在可能有点听不懂,写完代码就很好理解了,

我测的每隔2000次C的操作就重新建树排序是最优的。

800,1000,2200,3000 都是可以的。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <algorithm>
  5. #include <iostream>
  6. #include <queue>
  7. #include <string>
  8. #include <vector>
  9. #include <map>
  10. #define inf 0x3f3f3f3f
  11. #define inf64 0x3f3f3f3f3f3f3f3f
  12. using namespace std;
  13. const int maxn = 3e5 + ;
  14. typedef long long ll;
  15. ll a[maxn], lc[maxn], rc[maxn], num[maxn];
  16. string s[maxn];
  17. struct node
  18. {
  19. ll lazy, max, min, len;
  20. }tree[maxn*];
  21. void push_up(int id)
  22. {
  23. tree[id].max = max(tree[id << ].max, tree[id << | ].max);
  24. tree[id].min = min(tree[id << ].min, tree[id << | ].min);
  25. //printf("tree[%d].min=%lld tree[%d].max=%lld\n", id, tree[id].min, id, tree[id].max);
  26. }
  27.  
  28. void build(int id,int l,int r)
  29. {
  30. tree[id].len = r - l + ;
  31. tree[id].lazy = ;
  32. if(l==r)
  33. {
  34. tree[id].max = tree[id].min = a[l];
  35. return;
  36. }
  37. int mid = (l + r) >> ;
  38. build(id << , l, mid);
  39. build(id << | , mid + , r);
  40. push_up(id);
  41. }
  42.  
  43. void push_down(int id)
  44. {
  45. if(tree[id].lazy)
  46. {
  47. int val = tree[id].lazy;
  48. tree[id << ].max += val;
  49. tree[id << ].min += val;
  50. tree[id << | ].max += val;
  51. tree[id << | ].min += val;
  52. tree[id << ].lazy += val;
  53. tree[id << | ].lazy += val;
  54. // printf("tree[%d].max=%lld tree[%d].min=%lld\n", id << 1, tree[id << 1].max, id << 1, tree[id << 1].min);
  55. // printf("tree[%d].max=%lld tree[%d].min=%lld\n", id << 1 | 1, tree[id << 1 | 1].max, id << 1 | 1, tree[id << 1 | 1].min);
  56. tree[id].lazy = ;
  57. }
  58. }
  59. void update(int id,int l,int r,ll x,ll y,ll val)
  60. {
  61. push_down(id);
  62. // printf("id=%d l=%d r=%d x=%lld y=%lld val=%lld\n", id, l, r, x, y, val);
  63. if(tree[id].min>=x&&tree[id].max<=y)
  64. {
  65. tree[id].lazy = val;
  66. tree[id].min += val;
  67. tree[id].max += val;
  68. //printf("id=%d min=%lld max=%lld\n", id, tree[id].min, tree[id].max);
  69. return;
  70. }
  71. int mid = (l + r) >> ;
  72. if (tree[id << ].max >= x && tree[id << ].min <= y) update(id << , l, mid, x, y, val);
  73. if (tree[id << | ].max >= x && tree[id << | ].min <= y) update(id << | , mid + , r, x, y, val);
  74. push_up(id);
  75. }
  76.  
  77. int query(int id,int l,int r,ll x,ll y)
  78. {
  79. push_down(id);
  80. if(tree[id].max<=y&&tree[id].min>=x)
  81. {
  82. return tree[id].len;
  83. }
  84. int mid = (l + r) >> , ans = ;
  85. if (tree[id << ].max >= x && tree[id << ].min <= y) ans += query(id << , l, mid, x, y);
  86. if (tree[id << | ].max >= x && tree[id << | ].min <= y) ans += query(id << | , mid + , r, x, y);
  87. return ans;
  88. }
  89.  
  90. void push_alldown(int id,int l,int r)
  91. {
  92. if(l==r)
  93. {
  94. a[l] = tree[id].max;
  95. return;
  96. }
  97. push_down(id);
  98. int mid = (l + r) >> ;
  99. push_alldown(id << , l, mid);
  100. push_alldown(id << | , mid + , r);
  101. }
  102.  
  103. int main()
  104. {
  105. int n, m;
  106. while(scanf("%d%d",&n,&m)!=EOF)
  107. {
  108. for (int i = ; i <= n; i++) scanf("%lld", &a[i]);
  109. sort(a + , a + + n);
  110. build(, , n);
  111. int cnt = ;
  112. for(int i=;i<=m;i++)
  113. {
  114. cin >> s[i];
  115. if (s[i] == "C") scanf("%lld%lld%lld", &lc[i], &rc[i], &num[i]), cnt++;
  116. else scanf("%lld%lld", &lc[i], &rc[i]), num[i] = ;
  117. }
  118. int tot = ;
  119. for(int i=;i<=m;i++)
  120. {
  121. if(s[i]=="C")
  122. {
  123. ++tot;
  124. //push_alldown(1, 1, n);
  125. //printf("lc[%d]=%lld rc[%d]=%lld num[%d]=%lld\n", i, lc[i], i, rc[i], i, num[i]);
  126. update(, , n, lc[i], rc[i], num[i]);
  127. if(tot%==)
  128. {
  129. push_alldown(, , n);
  130. sort(a + , a + + n);
  131. build(, , n);
  132. }
  133. }
  134. else
  135. {
  136. int ans = query(, , n, lc[i], rc[i]);
  137. printf("%d\n", ans);
  138. }
  139. }
  140. }
  141. }

线段树 排序建树

Q - Play With Sequence HDU - 3971 线段树 重新排序建树的更多相关文章

  1. hdu 3436 线段树 一顿操作

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  2. hdu 3397 线段树双标记

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  3. hdu 2871 线段树(各种操作)

    Memory Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  4. hdu 4267 线段树间隔更新

    A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  5. hdu 4747 线段树

    Mex Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  6. hdu 3954 线段树 (标记)

    Level up Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. hdu 1754 线段树(Max+单点修改)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. hdu 1166 线段树(sum+单点修改)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

随机推荐

  1. 前端笔记(关于css盒模型知识整理)

    我以前整理的文章可能也不是特别深入.所以现在开始尝试即使多花点时间收集整理,也不只发浅层知识,这样对技术的深入理解是很有帮助的. 废话不多说,我们现在开始. 说到css盒模型,这是大多面试基础中会经常 ...

  2. 记录d3.js 力导向图的平移缩放,类似地图导航点击某一项移动到当前位置

    项目中有用到d3.js用于图结构的查询, 需求如下: 右上角有个模糊搜索功能,查询出来的结果用列表展示 点击列表的某一列,要求画布移动到当前选中的节点的位置,基于画布正中间 搜索出来的结果列表展示用的 ...

  3. MySQL的事务隔离级别是什么?

    我是平也,这有一个专注Gopher技术成长的开源项目「go home」 背景介绍 想必事务大家都已经非常熟悉了,它是一组SQL组成的一个执行单元,要么全执行要么全不执行,这也是它的一个特性--原子性. ...

  4. 移动硬盘临时文件太多怎么办,python黑科技帮你解决

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 星安果 PS:如果想了解更多关于python的应用,可以私信我,或者 ...

  5. springboot集成swagger2多模块中文配置详细步骤,解决集成mybatis或mybatis-plus无法正常使用问题

    pom.xm里写入swagger依赖: <dependency> <groupId>io.springfox</groupId> <artifactId> ...

  6. overload 与override的区别

    Override  是重写: 方法名称.参数个数,类型,顺序,返回值类型都是必须和父类方法一致的.它的关系是父子关系Overload 是重载:  方法名称不变,其余的都是可以变更的.它的关系是同一个类 ...

  7. 重启mysql服务

    重启mysql 启动mysql: 方式一:sudo /etc/init.d/mysql start 方式二:sudo service mysql start 停止mysql: 方式一:sudo /et ...

  8. google无法播放mp4 chrome无法播放h264

    写在前面 我在chrome上无法播放h264+Acc的mp4,在firefox.ie都可以播放,而且此mp4在vlc终可以正常播放. 视频链接:http://106.14.221.185:7001/p ...

  9. 资料整理:python接口类

    1开发原则(七大原则) 一:开放封闭原则 二:接口隔离原则(将不同接口对象一一展现出来,分别调用各自的接口,完成各自的功能) 三:依赖倒置原则 高级模块不能依赖低级模块,可以依赖抽象 规范的定义: 高 ...

  10. [函数] PHP取二进制文件头快速判断文件类型

    一般我们都是按照文件扩展名来判断文件类型,但其实不太靠谱,因为可以通过修改扩展名来伪装文件类型.其实我们可以通过读取文件信息来识别,比如 PHP扩展中提供了类似 exif_imagetype 这样的函 ...