https://scut.online/p/77

线段树的一种奇怪的应用,暴力区间更新,每次update直接pushdown到底部,然后从维护底部。这样下次update的时候假如提前遇到底部就很快返回了。每个节点更新60次,单次更新nlogn。更新完毕之后每次update都是几乎一个log就返回了。

  1. #include<bits/stdc++.h>
  2. typedef long long ll;
  3. using namespace std;
  4. const int MAXM = 100000;
  5. ll a[MAXM + 5];
  6. ll st[(MAXM << 2) + 5];
  7. bool zero[(MAXM << 2) + 5];
  8. const int mod = 1e9 + 7;
  9. inline void push_up(int o) {
  10. st[o] = (st[o << 1] + st[o << 1 | 1]) % mod;
  11. zero[o] = (zero[o << 1] && zero[o << 1 | 1]);
  12. }
  13. void build(int o, int l, int r) {
  14. if(l == r) {
  15. st[o] = a[l] % mod;
  16. zero[o] = (a[l] == 0);
  17. } else {
  18. int m = (l + r) >> 1;
  19. build(o << 1, l, m);
  20. build(o << 1 | 1, m + 1, r);
  21. push_up(o);
  22. }
  23. }
  24. void update(int o, int l, int r, int ql, int qr) {
  25. if(l == r) {
  26. a[l] >>= 1;
  27. st[o] = a[l] % mod;
  28. zero[o] = (a[l] == 0);
  29. return;
  30. }
  31. if(ql <= l && r <= qr && zero[o])
  32. return;
  33. int m = (l + r) >> 1;
  34. if(ql <= m)
  35. update(o << 1, l, m, ql, qr);
  36. if(qr >= m + 1)
  37. update(o << 1 | 1, m + 1, r, ql, qr);
  38. push_up(o);
  39. }
  40. ll query(int o, int l, int r, int ql, int qr) {
  41. if(ql <= l && r <= qr) {
  42. return st[o];
  43. } else {
  44. int m = (l + r) >> 1;
  45. ll ans = 0;
  46. if(ql <= m)
  47. ans = query(o << 1, l, m, ql, qr);
  48. if(qr >= m + 1)
  49. ans += query(o << 1 | 1, m + 1, r, ql, qr);
  50. return ans % mod;
  51. }
  52. }
  53. int main() {
  54. #ifdef Yinku
  55. freopen("Yinku.in", "r", stdin);
  56. #endif // Yinku
  57. int T, n, m;
  58. scanf("%d", &T);
  59. while(T--) {
  60. scanf("%d%d", &n, &m);
  61. for(int i = 1; i <= n ; ++i)
  62. scanf("%lld", &a[i]);
  63. build(1, 1, n);
  64. char op[20];
  65. int l, r;
  66. for(int i = 1; i <= m; ++i) {
  67. scanf("%s%d%d", op, &l, &r);
  68. if(op[0] == 'U') {
  69. update(1, 1, n, l, r);
  70. } else {
  71. printf("%lld\n", query(1, 1, n, l, r));
  72. }
  73. }
  74. }
  75. return 0;
  76. }

SCUT - 77 - 哈利波特与他的魔法杖 - 线段树的更多相关文章

  1. SCUT - 77 - 哈利波特与他的魔法杖

    https://scut.online/p/77 METO说是单点更新线段树.要记录哪些点不用再更新,不太清楚具体是要怎么实现? 一个类似的想法是把n个点建一棵平衡树,每次节点变成0之后从树上移除,至 ...

  2. UOJ#77. A+B Problem [可持久化线段树优化建边 最小割]

    UOJ#77. A+B Problem 题意:自己看 接触过线段树优化建图后思路不难想,细节要处理好 乱建图无果后想到最小割 白色和黑色只能选一个,割掉一个就行了 之前选白色必须额外割掉一个p[i], ...

  3. SCUT - 153 - 小马哥和他的山脉 - 线段树

    https://scut.online/p/153 其实不需要用线段树,只关心相邻元素的差,像神仙那样用差分就可以O1维护的. 但是我偏要用. 交之前写的那个,注意没有st本身的线段树只有lazy标记 ...

  4. SCUT - 321 - Tobby's magic - 线段树

    https://scut.online/p/321 第一次做区间线段树. 感觉和单点的一样啊.pushdown的时候要注意一些问题,st的值有可能是跟区间长度有关的. #include<bits ...

  5. [bzoj1067][SCOI2007]降雨量——线段树+乱搞

    题目大意 传送门 题解 我国古代有一句俗话. 骗分出奇迹,乱搞最神奇! 这句话在这道题上得到了鲜明的体现. 我的方法就是魔改版线段树,乱搞搞一下,首先借鉴了黄学长的建树方法,直接用一个节点维护年份的区 ...

  6. SCUT - 337 - 岩殿居蟹 - 线段树 - 树状数组

    https://scut.online/p/337 这个东西是个阶梯状的.那么可以考虑存两棵树,一棵树是阶梯的,另一棵树的平的,随便一减就是需要的阶梯. 优化之后貌似速度比树状数组还惊人. #incl ...

  7. P4915 帕秋莉的魔导书(动态开点线段树)

    题目背景 帕秋莉有一个巨大的图书馆,里面有数以万计的书,其中大部分为魔导书. 题目描述 魔导书是一种需要钥匙才能看得懂的书,然而只有和书写者同等或更高熟练度的人才能看得见钥匙.因此,每本魔导书都有它自 ...

  8. 【GDKOI2016】 魔卡少女 线段树

    题目大意:给你一个长度为n的序列${a_1....a_n}$,有$m$次操作 每次操作有两种情况:修改$a_i$的值,询问$[l,r]$中所有子区间的异或和. 数据范围:$n,m≤10^5$,$a_i ...

  9. 魔卡少女(cardcaptor)——线段树

    题目 [题目描述] 君君是中山大学的四年级学生.有一天在家不小心开启了放置在爸爸书房中的一本古书.于是,君君把放在书中最上面的一张牌拿出来观摩了一下,突然掀起一阵大风把书中的其她所有牌吹散到各地.这时 ...

随机推荐

  1. git-bash下, 启动sshd

    今天发现git-shell下居然有sshd.exe, 尝试了一下,居然起来了.在windiwos下起sshd也是如此简单. #先编辑C:\Program Files (x86)\Git\etc\ssh ...

  2. linux运维、架构之路-CentOS6.9安装Zabbix3.4.1

    一.LAMP环境安装 1.环境 [root@m01 ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@m01 ~]# uname ...

  3. js-进度条-动画

    效果图如下:       HTML: <h1>js实现进度条</h1> <div id="warp"> <div id="inn ...

  4. java获取当前时间的年周月季度等的开始结束时间

    import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * Created b ...

  5. mysql UNION操作符 语法

    mysql UNION操作符 语法 作用:用于合并两个或多个 SELECT 语句的结果集. 语法:SELECT column_name(s) FROM table_name1 UNION SELECT ...

  6. BZOJ 2288: 【POJ Challenge】生日礼物 贪心 + 堆 + 链表

    好像是模拟费用流 Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r" ...

  7. Java——动态绑定和多态

    动态绑定是在执行期间(而不是编译期间)判断所用对象的实际类型,根据其实际的类型调用其相应的方法(确定选择哪个多态形式被调用). 首先是方法的参数是父类对象,传入子类对象是否可行 然后引出Parent ...

  8. 【bzoj2064】【分裂】状态压缩表示合并子集

    (上不了p站我要死了,画师当然是wlop大大啦) 感觉这个做法还是挺难想的. 但还是总结一下思路吧.. "只可意会不可言传的状压dp"(乱说) Description 背景: 和久 ...

  9. http协议的深刻理解

    https://www.cnblogs.com/mayite/p/9095986.html

  10. 编写灵活、稳定、高质量的HTML代码的规范

    一.唯一定律 无论有多少人共同参与同一项目,一定要确保每一行代码都像是唯一个人编写的. 二.HTML 2.1 语法 (1)用两个空格来代替制表符(tab) -- 这是唯一能保证在所有环境下获得一致展现 ...