OJ题号:洛谷2023、BZOJ1798

思路:

参见[洛谷3373]【模板】线段树 2

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<algorithm>
  6. using namespace std;
  7. #define ll long long
  8. #define maxn 100001
  9. #define root 1
  10. #define _left <<1
  11. #define _right <<1|1
  12. int n,m;
  13. ll mod;
  14. inline int getint() {
  15. char ch;
  16. while(!isdigit(ch=getchar()));
  17. int x=ch^'';
  18. while(isdigit(ch=getchar())) x=((x+(x<<))<<)+(ch^'');
  19. return x;
  20. }
  21. inline ll getll() {
  22. char ch;
  23. while(!isdigit(ch=getchar()));
  24. ll x=ch^'';
  25. while(isdigit(ch=getchar())) x=((x+(x<<))<<)+(ch^'');
  26. return x;
  27. }
  28. struct SegmentTree {
  29. ll val[maxn<<],add[maxn<<],mul[maxn<<];
  30. void push_up(const int p) {
  31. val[p]=(val[p _left]+val[p _right])%mod;
  32. }
  33. void build(const int p,const int b,const int e) {
  34. mul[p]=;
  35. add[p]=;
  36. if(b==e) {
  37. val[p]=getll()%mod;
  38. return;
  39. }
  40. int mid=(b+e)>>;
  41. build(p _left,b,mid);
  42. build(p _right,mid+,e);
  43. push_up(p);
  44. }
  45. int length(const int b,const int e) {
  46. return e-b+;
  47. }
  48. void push_down(const int p,const int b,const int e) {
  49. if(mul[p]!=) {
  50. val[p _left]=val[p _left]*mul[p]%mod;
  51. val[p _right]=val[p _right]*mul[p]%mod;
  52. mul[p _left]=mul[p _left]*mul[p]%mod;
  53. mul[p _right]=mul[p _right]*mul[p]%mod;
  54. add[p _left]=add[p _left]*mul[p]%mod;
  55. add[p _right]=add[p _right]*mul[p]%mod;
  56. mul[p]=;
  57. }
  58. if(add[p]) {
  59. int mid=(b+e)>>;
  60. val[p _left]=(val[p _left]+add[p]*length(b,mid))%mod;
  61. val[p _right]=(val[p _right]+add[p]*length(mid+,e))%mod;
  62. add[p _left]=(add[p _left]+add[p])%mod;
  63. add[p _right]=(add[p _right]+add[p])%mod;
  64. add[p]=;
  65. }
  66. }
  67. void modify_mul(const int p,const int b,const int e,const int l,const int r,const ll x) {
  68. if((b==l)&&(e==r)) {
  69. val[p]=val[p]*x%mod;
  70. mul[p]=mul[p]*x%mod;
  71. add[p]=add[p]*x%mod;
  72. return;
  73. }
  74. push_down(p,b,e);
  75. int mid=(b+e)>>;
  76. if(l<=mid) modify_mul(p _left,b,mid,l,min(mid,r),x);
  77. if(r>mid) modify_mul(p _right,mid+,e,max(mid+,l),r,x);
  78. push_up(p);
  79. }
  80. void modify_add(const int p,const int b,const int e,const int l,const int r,const ll x) {
  81. if((b==l)&&(e==r)) {
  82. val[p]=(val[p]+x*length(b,e))%mod;
  83. add[p]=(add[p]+x)%mod;
  84. return;
  85. }
  86. push_down(p,b,e);
  87. int mid=(b+e)>>;
  88. if(l<=mid) modify_add(p _left,b,mid,l,min(mid,r),x);
  89. if(r>mid) modify_add(p _right,mid+,e,max(mid+,l),r,x);
  90. push_up(p);
  91. }
  92. ll query(const int p,const int b,const int e,const int l,const int r) {
  93. if((b==l)&&(e==r)) {
  94. return val[p];
  95. }
  96. int mid=(b+e)>>;
  97. ll ans=;
  98. push_down(p,b,e);
  99. if(l<=mid) ans=(ans+query(p _left,b,mid,l,min(mid,r)))%mod;
  100. if(r>mid) ans=(ans+query(p _right,mid+,e,max(mid+,l),r))%mod;
  101. return ans;
  102. }
  103. };
  104. SegmentTree tree;
  105. int main() {
  106. n=getint();
  107. mod=getll();
  108. tree.build(root,,n);
  109. m=getint();
  110. while(m--) {
  111. int op=getint(),x=getint(),y=getint();
  112. if(op==) {
  113. ll k=getll()%mod;
  114. tree.modify_mul(root,,n,x,y,k);
  115. continue;
  116. }
  117. if(op==) {
  118. ll k=getll()%mod;
  119. tree.modify_add(root,,n,x,y,k);
  120. continue;
  121. }
  122. printf("%lld\n",tree.query(root,,n,x,y));
  123. }
  124. return ;
  125. }

[AHOI2009]维护序列的更多相关文章

  1. BZOJ_1798_[AHOI2009]维护序列_线段树

    BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...

  2. [Luogu 2023] AHOI2009 维护序列

    [Luogu 2023] AHOI2009 维护序列 恕我冒昧这和线段树模板二有个琴梨区别? #include <cstdio> int n,m; long long p; class S ...

  3. [洛谷P2023] [AHOI2009]维护序列

    洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...

  4. 洛谷 2023 [AHOI2009]维护序列

    洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...

  5. 洛谷 P2023 [AHOI2009]维护序列

    P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中 ...

  6. 洛谷 P2023 [AHOI2009]维护序列 题解

    P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中 ...

  7. 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)

    洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...

  8. 洛谷P3373 【模板】线段树 2 && P2023 [AHOI2009]维护序列——题解

    题目传送: P3373 [模板]线段树 2  P2023 [AHOI2009]维护序列 该题较传统线段树模板相比多了一个区间乘的操作.一提到线段树的区间维护问题,就自然想到了“懒标记”:为了降低时间复 ...

  9. P2023 [AHOI2009]维护序列 题解(线段树)

    题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这 ...

  10. bzoj1798 [Ahoi2009]维护序列

    Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...

随机推荐

  1. Canvas锯齿问题

    canvas的宽高必须通过HTML属性指定,不能通过CSS指定,否则会有锯齿 这个是通过CSS定义宽高,绘制的图形 #myCanvas{ background: black; height: 800p ...

  2. 论文阅读笔记二十九:SSD: Single Shot MultiBox Detector(ECCV2016)

    论文源址:https://arxiv.org/abs/1512.02325 tensorflow代码:https://github.com/balancap/SSD-Tensorflow 摘要 SSD ...

  3. HTTP 599: SSL certificate problem: unable to get local issuer certificate错误

    自己在用 PySpider 框架爬虫运行代码后时出现 HTTP 599: SSL certificate problem: unable to get local issuer certificate ...

  4. 字典树HihoCoder - 1014

    输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英文字母组成,可能存在相同的单词,此时应将其视作不同的单词.接 ...

  5. Linux下Nginx安装/启动/重启/停止

    Nginx是高性能的web服务器也是非常好用反向代理服务器,可以实现负载均衡,动静分离等策略,在linux下用的非常多.下面是下载地址   http://nginx.org/en/download.h ...

  6. 设置git记住用户和密码

     git config --global credential.helper store

  7. ElasticSearch简要总览

    今天看了一下ElasticSearch的相关文档,我做了如下总结: 发现越来越喜欢画图归纳总结知识了,看图说话 集群特性说明 健康状况的说明 如何配置分片? 接下来一张图总结下操作相关的总结 接下来, ...

  8. WMSYS.WM_CONCAT返回CLOB类型的解决办法

    https://blog.csdn.net/cnm_csdn_wt/article/details/80047878

  9. Python学习(十八)—— 数据库(三)

    转载自http://www.cnblogs.com/linhaifeng/articles/7356064.html 一.数据操作 1.插入数据INSERT 1. 插入完整数据(顺序插入) 语法一: ...

  10. BZOJ1010 [HNOI2008]玩具装箱toy 动态规划 斜率优化

    原文链接http://www.cnblogs.com/zhouzhendong/p/8687797.html 题目传送门 - BZOJ1010 题意 一个数列$C$,然后把这个数列划分成若干段. 对于 ...