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


大概就是维护两个标记的线段树模板题。

设定优先级,先乘后加(只是相对的),$pushdown$的时候乘法标记直接乘,加法标记先乘上父亲的乘法标记再加上父亲的加法标记。


  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<cstdlib>
  6. #include<cmath>
  7. #include<cstring>
  8. using namespace std;
  9. #define maxn 1001000
  10. #define llg long long
  11. #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
  12. llg n,m,md;
  13.  
  14. struct SEGMENT_TREE
  15. {
  16. llg val[maxn],addv[maxn],mul[maxn];
  17. bool bj[maxn];
  18. void init(){memset(val,,sizeof(val)); memset(mul,,sizeof(mul)); memset(addv,,sizeof(addv)); memset(bj,,sizeof(bj));}
  19.  
  20. void build(llg o,llg l,llg r)
  21. {
  22. if (l==r)
  23. {
  24. addv[o]=,mul[o]=;
  25. scanf("%lld",&val[o]);
  26. return ;
  27. }
  28. llg mid=(l+r)>>,lc=o<<,rc=o<<|;
  29. build(lc,l,mid);
  30. build(rc,mid+,r);
  31. val[o]=val[lc]+val[rc];
  32. mul[o]=; addv[o]=;
  33. }
  34.  
  35. void pushdown(llg o,llg l,llg r)
  36. {
  37. llg lc=o<<,rc=o<<|;
  38. mul[lc]*=mul[o],mul[lc]%=md;
  39. mul[rc]*=mul[o],mul[rc]%=md;
  40. addv[lc]*=mul[o],addv[lc]%=md;
  41. addv[rc]*=mul[o],addv[rc]%=md;
  42. addv[lc]+=addv[o],addv[lc]%=md;
  43. addv[rc]+=addv[o],addv[rc]%=md;
  44. val[o]=val[o]*mul[o]+addv[o]*(r-l+); val[o]%=md;
  45. addv[o]=,mul[o]=;
  46. }
  47.  
  48. void add_(llg o,llg l,llg r,llg L,llg R,llg V)
  49. {
  50. pushdown(o,l,r);
  51. if (L>r || R<l) return ;
  52. if (l>=L && r<=R)
  53. {
  54. addv[o]+=V;
  55. pushdown(o,l,r);
  56. return ;
  57. }
  58. llg mid=(l+r)>>,lc=o<<,rc=o<<|;
  59. add_(lc,l,mid,L,R,V);
  60. add_(rc,mid+,r,L,R,V);
  61. val[o]=val[lc]+val[rc]; val[o]%=md;
  62. }
  63.  
  64. void mul_(llg o,llg l,llg r,llg L,llg R,llg V)
  65. {
  66. pushdown(o,l,r);
  67. if (L>r || R<l) return ;
  68. if (l>=L && r<=R)
  69. {
  70. mul[o]*=V;
  71. pushdown(o,l,r);
  72. return ;
  73. }
  74. llg mid=(l+r)>>,lc=o<<,rc=o<<|;
  75. mul_(lc,l,mid,L,R,V);
  76. mul_(rc,mid+,r,L,R,V);
  77. val[o]=val[lc]+val[rc]; val[o]%=md;
  78. }
  79.  
  80. llg sum(llg o,llg l,llg r,llg L,llg R)
  81. {
  82. pushdown(o,l,r);
  83. if (L>r || R<l) return ;
  84. if (l>=L && r<=R)
  85. {
  86. return val[o];
  87. }
  88. llg mid=(l+r)>>,lc=o<<,rc=o<<|,tot=;
  89. tot+=sum(lc,l,mid,L,R);
  90. tot+=sum(rc,mid+,r,L,R);
  91. val[o]=val[lc]+val[rc]; val[o]%=md;
  92. return tot%md;
  93. }
  94.  
  95. }tree;
  96.  
  97. int main()
  98. {
  99. tree.init();
  100. yyj("a");
  101. cin>>n>>md;
  102. tree.build(,,n);
  103. llg T,type,l,r,v;
  104. cin>>T;
  105. while (T--)
  106. {
  107. scanf("%lld",&type);
  108. if (type==)
  109. {
  110. scanf("%lld%lld%lld",&l,&r,&v);
  111. tree.mul_(,,n,l,r,v);
  112. }
  113. if (type==)
  114. {
  115. scanf("%lld%lld%lld",&l,&r,&v);
  116. tree.add_(,,n,l,r,v);
  117. }
  118. if (type==)
  119. {
  120. scanf("%lld%lld",&l,&r);
  121. printf("%lld\n",tree.sum(,,n,l,r));
  122. }
  123. }
  124. return ;
  125. }

【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. BZOJ1798: [Ahoi2009]Seq 维护序列seq

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

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

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

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

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

随机推荐

  1. Selenium 常用定位对象元素的方法

    常见定位对象元素的方法 在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素.其中By类的常用定位方 ...

  2. GoldenGate 12.3发布

    新特性: oracle db1. 支持12.2 oracle db2. 支持微服务架构, 可以使用restful api 管理OGG3. Parallel replicat,性能比integrated ...

  3. 自动部署war包脚本

    war 包所在路径为:/home/wars/ROOT.war tomcat 所在路径为: ①:/home/search-3 ②:/home/search-4 部署单个war到一个tomcat中 #!/ ...

  4. 基于SecureCRT的测试环境的克隆的linux/vi相关命令

    #chmod -R 777*; 参数-R:对当前目录下的所有档案与子目录进行相同的权限 变更(即以递归的方式逐个变更). *:通配符,指的是当前目录下的所有文件及目录. 所有文件及其子目录的文件拥有者 ...

  5. HTML <​canvas> testing with Selenium and OpenCV

    from: https://www.linkedin.com/pulse/html-canvas-testing-selenium-opencv-maciej-kusz Since HTML < ...

  6. Centos环境自写脚本查看使用php或nginx占用内存

    在CentOs6.4下,用root权限测试. # cd ~ //进入home目录 # vim .bashrc //编辑文件,把下面代码放入地址 mem () { top -n1 -b | head - ...

  7. 阿里云centos远程连接mysql

    首先在服务器管理控制台设置防火墙规则 添加规则 使用root登录到mysql 添加一个用户名,权限为%的远程连接用户 grant all on *.* to 'yuancheng'@'%' ident ...

  8. Pycharm小技巧

    Pycharm专业版2017.3及以上 Python2.7.x及以上 补全与高亮 在创建python2.7,django1.10的项目时,碰到html代码不补全也不高亮的问题,解决思路如下: # 依次 ...

  9. oracle No more data to read from socket之ora-07445排查解决

    今天下午,原来一个部门的同事找过来,说有个即将上线的环境偶尔会出现 No more data to read from socket错误,版本是oracle 11.2.0.1,如下: 经查,这个问题原 ...

  10. dubbo环境搭建与tomcat集成、DEMO示例、常见问题(最完整版本、带管理控制台、监控中心、zookeeper)

    以windows为例,linux基本相同,开发环境一般linux,个人环境一般windows(如果不开额外vm的话). 示例以dubbo官方自带demo为例子,进行整合和稍加修改测试. 0.dubbo ...