原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798

线段树区间更新:

  1. 1. 区间同同时加上一个数
  2. 2. 区间同时乘以一个数
  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstdlib>
  4. #include<cstdio>
  5. #define lc root<<1
  6. #define rc root<<1|1
  7. typedef unsigned long long ull;
  8. const int Max_N = ;
  9. int Mod;
  10. struct Node {
  11. ull sum, add, mul;
  12. };
  13. struct SegTree {
  14. Node seg[Max_N << ];
  15. inline void push_up(int root) {
  16. seg[root].sum = (seg[lc].sum + seg[rc].sum) % Mod;
  17. }
  18. inline void built(int root, int l, int r) {
  19. seg[root].add = , seg[root].mul = ;
  20. if (l == r) {
  21. scanf("%lld", &seg[root].sum);
  22. seg[root].sum %= Mod;
  23. return;
  24. }
  25. int mid = (l + r) >> ;
  26. built(lc, l, mid);
  27. built(rc, mid + , r);
  28. push_up(root);
  29. }
  30. inline void push_down(int root, int len) {
  31. if (seg[root].add != || seg[root].mul != ) {
  32. ull &_add = seg[root].add, &_mul = seg[root].mul;
  33. seg[lc].sum = (seg[lc].sum * _mul + (len - (len >> )) * _add) % Mod;
  34. seg[lc].mul = (seg[lc].mul * _mul) % Mod;
  35. seg[lc].add = (seg[lc].add * _mul + _add) % Mod;
  36. seg[rc].sum = (seg[rc].sum * _mul + (len >> ) * _add) % Mod;
  37. seg[rc].mul = (seg[rc].mul * _mul) % Mod;
  38. seg[rc].add = (seg[rc].add * _mul + _add) % Mod;
  39. _add = , _mul = ;
  40. }
  41. }
  42. inline void update(int root, int l, int r, int x, int y, ull val, ull mul) {
  43. if (x > r || y < l) return;
  44. if (x <= l && y >= r) {
  45. seg[root].add = (seg[root].add * mul + val) % Mod;
  46. seg[root].mul = (seg[root].mul * mul) % Mod;
  47. seg[root].sum = (seg[root].sum * mul + val * (r - l + )) % Mod;
  48. return;
  49. }
  50. push_down(root, r - l + );
  51. int mid = (l + r) >> ;
  52. update(lc, l, mid, x, y, val, mul);
  53. update(rc, mid + , r, x, y, val, mul);
  54. push_up(root);
  55. }
  56. inline ull query(int root, int l, int r, int x, int y) {
  57. if (x > r || y < l) return ;
  58. if (x <= l && y >= r) {
  59. return seg[root].sum;
  60. }
  61. push_down(root, r - l + );
  62. ull ret = ;
  63. int mid = (l + r) >> ;
  64. ret += query(lc, l, mid, x, y);
  65. ret += query(rc, mid + , r, x, y);
  66. return ret %= Mod;
  67. }
  68. }seg;
  69. int main() {
  70. #ifdef LOCAL
  71. freopen("in.txt", "r", stdin);
  72. freopen("out.txt", "w+", stdout);
  73. #endif
  74. int n, m, a, b, c, d;
  75. while (~scanf("%d %d", &n, &Mod)) {
  76. seg.built(, , n);
  77. scanf("%d", &m);
  78. while (m--) {
  79. scanf("%d", &a);
  80. if ( == a) {
  81. scanf("%d %d %d", &b, &c, &d);
  82. seg.update(, , n, b, c, , d);
  83. } else if ( == a) {
  84. scanf("%d %d %d", &b, &c, &d);
  85. seg.update(, , n, b, c, d, );
  86. } else {
  87. scanf("%d %d", &b, &c);
  88. printf("%lld\n", seg.query(, , n, b, c));
  89. }
  90. }
  91. }
  92. return ;
  93. }
  1.  

bzoj 1798 [Ahoi2009]Seq 维护序列seq的更多相关文章

  1. BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )

    线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...

  2. bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 7773  Solved: 2792[Submit ...

  3. bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...

  4. Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...

  5. 1798: [Ahoi2009]Seq 维护序列seq

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 2930  Solved: 1087[Submit ...

  6. BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 5504  Solved: 1937[Submit ...

  7. 【BZOJ】1798: [Ahoi2009]Seq 维护序列seq

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798 大概就是维护两个标记的线段树模板题. 设定优先级,先乘后加(只是相对的),$push ...

  8. BZOJ1798: [Ahoi2009]Seq 维护序列seq

    传送门 写这道题是为了get一个同时传送乘法下标和加法下标的小技巧,线段树模板题.不多说. 标记名字打错无限智力-- //BZOJ 1798 //by Cydiater //2016.9.13 #in ...

  9. 【BZOJ】1798: [Ahoi2009]Seq 维护序列seq(线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1798 之前写了个快速乘..........................20多s...... 还好 ...

  10. bzoj 1798 [Ahoi2009]Seq 维护序列seq(线段树+传标)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1798 [题意] 给定一个序列,要求提供区间乘/加,以及区间求和的操作 [思路] 线段树 ...

随机推荐

  1. Oracle 查看表空间剩余与创建空间语法

    select a.tablespace_name,total,free,total-free used from ( select tablespace_name,sum(bytes)/1024/10 ...

  2. ORA-00933: SQL command not properly ended

    今天写了一个小的SQL语句类似下面的这句: UPDATE A SET ID=B.ID FROM A,B WHERE A.NAME=B.NAME 在执行时居然报了“ORA-00933: SQL comm ...

  3. 三味书屋 bbb

    为学日益 ,为道日损 .损之又损,以至于无为

  4. WF4 常用类<第二篇>

    一.WorkflowInvoker 常用方法如下: 方法 说明 BeginInvoke() 使用指定的 AsyncCallback 和用户提供的状态以异步方式调用工作流 EndInvoke() 返回使 ...

  5. java 个人总结

    每周课程总结链接: 第一周 第二周 第三周 第四周 第五周 第六周 第七周 第八周 第九周 第十周 java实验报告链接: 实验一 实验二 实验三 实验四 实验五 代码托管链接 课程收获: 学习任何语 ...

  6. Groovy轻松入门——搭建Groovy开发环境

    摘自: http://www.blogjava.net/BlueSUN/archive/2007/03/17/104391.html Groovy轻松入门--搭建Groovy开发环境 多日来,我发表了 ...

  7. 解读CSS布局之-水平垂直居

    对一个元素水平垂直居中,在我们的工作中是会经常遇到的,也是CSS布局中很重要的一部分,本文就来讲讲CSS水平垂直居中的一些方法.由于我们大搜车的日常工作中已经不再需要理会低版本IE,所以本文所贴出的方 ...

  8. 如何获取tableview中当前选中的cell

    当我们点击某个cell时,会执行下面这个方法,方法中调用另一方法执行具体操作: - (void)tableView:(UITableView *)tableView didSelectRowAtInd ...

  9. 解决Android sdk更新不能下载或下载内容过慢

    Android Android SDK 配置步骤 启动 Android SDK Manager ,打开主界面,依次选择「Tools」.「Options...」,弹出『Android SDK Manag ...

  10. 下载uboot的调试版本到开发板的sdram中运行

    开发环境:开发板:FriendlyARM Tiny6410 主机:CentOS release 6.4 (Final) 开发板与主机通过串口线连接 调试用的uboot源码为开发板光盘提供的u-boot ...