题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1798

先乘后加,就可给加法标记乘上乘法标记。

注意可能有 *0 的操作,所以 pshd 时不是 cg[ cr ]>1 而是 cg[ cr ]!=1 。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define ll long long
  6. #define ls Ls[cr]
  7. #define rs Rs[cr]
  8. using namespace std;
  9. const int N=1e5+,M=N<<;
  10. int n,m,mod,a[N],Ls[M],Rs[M],cg[M],jg[M],sm[M],tot;
  11. int rdn()
  12. {
  13. int ret=;bool fx=;char ch=getchar();
  14. while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
  15. while(ch>=''&&ch<='') ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
  16. return fx?ret:-ret;
  17. }
  18. int g[];
  19. void wrt(int x)
  20. {
  21. if(x<)putchar('-'),x=-x;
  22. if(!x){puts("");return;}
  23. int t=;while(x)g[++t]=x%,x/=;
  24. while(t)putchar(g[t]+''),t--;puts("");
  25. }
  26. void upd(int &x){x>=mod?x-=mod:;}
  27. void pshp(int cr){sm[cr]=sm[ls]+sm[rs];upd(sm[cr]);}
  28. void build(int l,int r,int cr)
  29. {
  30. cg[cr]=;
  31. if(l==r){sm[cr]=a[l]%mod;return;}
  32. int mid=l+r>>;
  33. ls=++tot; build(l,mid,ls);
  34. rs=++tot; build(mid+,r,rs);
  35. pshp(cr);
  36. }
  37. void pshd(int cr,int l,int mid,int r)
  38. {
  39. if(cg[cr]!=)
  40. {
  41. int w=cg[cr]; cg[cr]=;
  42. cg[ls]=(ll)cg[ls]*w%mod; cg[rs]=(ll)cg[rs]*w%mod;
  43. jg[ls]=(ll)jg[ls]*w%mod; jg[rs]=(ll)jg[rs]*w%mod;
  44. sm[ls]=(ll)sm[ls]*w%mod; sm[rs]=(ll)sm[rs]*w%mod;
  45. }
  46. if(jg[cr])
  47. {
  48. int w=jg[cr]; jg[cr]=;
  49. jg[ls]+=w;upd(jg[ls]); jg[rs]+=w;upd(jg[rs]);
  50. sm[ls]=(sm[ls]+(ll)(mid-l+)*w)%mod; sm[rs]=(sm[rs]+(ll)(r-mid)*w)%mod;
  51. }
  52. }
  53. void mdfy(int l,int r,int cr,int L,int R,int k,bool fx)
  54. {
  55. if(l>=L&&r<=R)
  56. {
  57. if(!fx)
  58. cg[cr]=(ll)cg[cr]*k%mod, sm[cr]=(ll)sm[cr]*k%mod, jg[cr]=(ll)jg[cr]*k%mod;
  59. else
  60. jg[cr]+=k,upd(jg[cr]),sm[cr]=(sm[cr]+(ll)(r-l+)*k)%mod;
  61. return;
  62. }
  63. int mid=l+r>>; pshd(cr,l,mid,r);
  64. if(L<=mid)mdfy(l,mid,ls,L,R,k,fx);
  65. if(mid<R)mdfy(mid+,r,rs,L,R,k,fx);
  66. pshp(cr);
  67. }
  68. int query(int l,int r,int cr,int L,int R)
  69. {
  70. if(l>=L&&r<=R)return sm[cr];
  71. int mid=l+r>>,ret=; pshd(cr,l,mid,r);
  72. if(L<=mid)ret=query(l,mid,ls,L,R);
  73. if(mid<R)ret+=query(mid+,r,rs,L,R),upd(ret);
  74. return ret;
  75. }
  76. int main()
  77. {
  78. n=rdn(); mod=rdn();
  79. for(int i=;i<=n;i++)a[i]=rdn();
  80. tot=; build(,n,);
  81. m=rdn();
  82. for(int i=,op,l,r,k;i<=m;i++)
  83. {
  84. op=rdn();l=rdn();r=rdn();
  85. if(op==)
  86. {
  87. k=rdn()%mod;mdfy(,n,,l,r,k,);
  88. }
  89. if(op==)
  90. {
  91. k=rdn()%mod;mdfy(,n,,l,r,k,);
  92. }
  93. if(op==)
  94. wrt(query(,n,,l,r));
  95. }
  96. return ;
  97. }

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

  1. 【BZOJ1798】【AHOI2009】维护序列(线段树)

    题目链接 题解 这不就是luogu的线段树2的板子吗.... 没有任何的区别... 上代码吧... #include<iostream> #include<cstdio> #i ...

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

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

  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. bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)

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

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

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

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

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

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

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

  9. [AHOI 2009] 维护序列(线段树模板题)

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

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

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

随机推荐

  1. 基于R语言的数据分析和挖掘方法总结——中位数检验

    3.1 单组样本符号秩检验(Wilcoxon signed-rank test) 3.1.1 方法简介 此处使用的统计分析方法为美国统计学家Frank Wilcoxon所提出的非参数方法,称为Wilc ...

  2. 在freescale mx6q平台上添加spi资源

    1:配置管脚为SPI功能 在board-mx6q_sabresd.h的最后添加,复制被重定义 (以添加SPI2为例) <span style="font-size:18px;" ...

  3. 释放Linux系统缓存

    清理Linux缓存使用下面的命令 sync; echo 3 > /proc/sys/vm/drop_caches 需求与原理 下面介绍buffer与cache的差别: A buffer is s ...

  4. R的基础学习之数据结构

    来源:http://blog.qiubio.com:8080/archives/3753/4 1.atomic vector :一维的,放置同一类型数据的数据类型 1.1创建:由c()函数 ,seq( ...

  5. mongodb 中 Aggregation 的管道和分片集合( Pipeline and Sharded Collections)

    mongodb 中的aggretion 中,如果管道中存在一个与之相匹配的shard key ,那么这个管道只运行在与之相匹配的shard 中,在以前(3.2),pipeline 被分流,最后又由pr ...

  6. JMeter学习(八)JDBC测试计划-连接Oracle

    一.测试环境准备   Oracle:10g  JDBC驱动:classes12.jar oracle安装目录下(oracle\product\10.2.0\db_1\jdbc\lib\classes1 ...

  7. 九度oj-题目1103:二次方程计算器

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2799 解决:633 题目描述: 设计一个二次方程计算器 输入: 每个案例是关于x的一个二次方程表达式,为了简单,每个系数都是整数形式. 输 ...

  8. HttpClient技术

    1.什么是HttpClient? 2.HttpClient特点? 特点: 2.1. 基于标准.纯净的Java语言.实现了Http1.0和Http1.1 2.2. 以可扩展的面向对象的结构实现了Http ...

  9. nginx 反向代理配置之---可配置多域名请求

    配置文件如下: server { listen 80; server_name ngin服务器所对应的的域名; error_log /data/logs/nginx/mainsite.error.lo ...

  10. 中文乱码问题(页面乱码,eclipse乱码,请求响应乱码)

    1.首先在开发工具eclipse中设置工作空间和文件编码格式,详情参见   http://www.cnblogs.com/lixiang1993/p/7345161.html 2.在eclipse的安 ...