【题目链接】

  http://www.lydsy.com/JudgeOnline/problem.php?id=1798

【题意】

给定一个序列,要求提供区间乘/加,以及区间求和的操作

【思路】

线段树+传标。

下传标记的方式可以类比这里 click here

【代码】

  1. #include<set>
  2. #include<cmath>
  3. #include<queue>
  4. #include<vector>
  5. #include<cstdio>
  6. #include<cstring>
  7. #include<iostream>
  8. #include<algorithm>
  9. #define trav(u,i) for(int i=front[u];i;i=e[i].nxt)
  10. #define FOR(a,b,c) for(int a=(b);a<=(c);a++)
  11. using namespace std;
  12.  
  13. typedef long long ll;
  14. const int N = 2e5+;
  15.  
  16. ll read() {
  17. char c=getchar();
  18. ll f=,x=;
  19. while(!isdigit(c)) {
  20. if(c=='-') f=-; c=getchar();
  21. }
  22. while(isdigit(c))
  23. x=x*+c-'',c=getchar();
  24. return x*f;
  25. }
  26.  
  27. int MOD ;
  28.  
  29. struct Tnode {
  30. int u,l,r;
  31. ll sum,add,mul;
  32. void mulv(ll x) ;
  33. void addv(ll x) ;
  34. void pushdown() ;
  35. void maintain() ;
  36. } T[N<<] ;
  37. void Tnode::mulv(ll x) {
  38. mul=(mul*x)%MOD;
  39. sum=(sum*x)%MOD;
  40. add=(add*x)%MOD;
  41. }
  42. void Tnode::addv(ll x) {
  43. sum=(sum+(r-l+)*x)%MOD;
  44. add=(add+x)%MOD;
  45. }
  46. void Tnode::pushdown() {
  47. if(mul!=) {
  48. T[u<<].mulv(mul);
  49. T[u<<|].mulv(mul);
  50. mul=;
  51. }
  52. if(add) {
  53. T[u<<].addv(add);
  54. T[u<<|].addv(add);
  55. add=;
  56. }
  57. }
  58. void Tnode::maintain() {
  59. sum=(T[u<<].sum+T[u<<|].sum)%MOD;
  60. }
  61. void update(int u,int L,int R,int x,int flag) {
  62. T[u].pushdown();
  63. if(L<=T[u].l&&T[u].r<=R) {
  64. if(flag==) T[u].addv(x);
  65. else T[u].mulv(x);
  66. } else {
  67. int mid=T[u].l+T[u].r>>;
  68. if(L<=mid) update(u<<,L,R,x,flag);
  69. if(mid<R) update(u<<|,L,R,x,flag);
  70. T[u].maintain();
  71. }
  72. }
  73. ll query(int u,int L,int R) {
  74. T[u].pushdown();
  75. if(L<=T[u].l&&T[u].r<=R)
  76. return T[u].sum;
  77. else {
  78. int mid=T[u].l+T[u].r>>;
  79. ll ans=;
  80. if(L<=mid) ans=(ans+query(u<<,L,R))%MOD;
  81. if(mid<R) ans=(ans+query(u<<|,L,R))%MOD;
  82. return ans;
  83. }
  84. }
  85.  
  86. int n,m; ll a[N];
  87.  
  88. void build(int u,int l,int r) {
  89. T[u]=(Tnode){u,l,r,,,};
  90. if(l==r) {
  91. T[u].sum=a[l]%MOD;
  92. return ;
  93. } else {
  94. int mid=l+r>>;
  95. build(u<<,l,mid);
  96. build(u<<|,mid+,r);
  97. T[u].maintain();
  98. }
  99. }
  100. /* Debug
  101. int print(int u) {
  102. T[u].pushdown();
  103. if(T[u].l==T[u].r) printf("%d,%d\n",T[u].l,T[u].v);
  104. else {
  105. print(u<<1),print(u<<1|1);
  106. }
  107. }
  108. */
  109. int main()
  110. {
  111. // freopen("in.in","r",stdin);
  112. // freopen("out.out","w",stdout);
  113. n=read(),MOD=read();
  114. FOR(i,,n) a[i]=read();
  115. build(,,n);
  116. m=read();
  117. int op,l,r,x;
  118. FOR(i,,m) {
  119. op=read(),l=read(),r=read();
  120. if(op==) {
  121. x=read();
  122. update(,l,r,x,);
  123. } else
  124. if(op==) {
  125. x=read();
  126. update(,l,r,x,);
  127. } else {
  128. printf("%lld\n",query(,l,r));
  129. }
  130. }
  131. return ;
  132. }

P.S.我竟然蛋疼的存了一个v,还一本正经地累计到sum里 <_<

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 老师交给小可可一个维护数列的任务,现在小 ...

随机推荐

  1. eclipse中(装了插件m2eclipse后的)导入maven工程显示"感叹号"

      有时候导入一些开源工程(maven结构的),在eclipse中(装了插件m2eclipse后的)该工程前面会有一个小的红色感叹号,但点开工程后没有发现有打小红叉的内容,这种情况其实大部分是jar包 ...

  2. 2410中断中SRCPND和INTPND清零的疑问

    2410中断中SRCPND和INTPND清零的疑问SRCPND是中断源引脚寄存器,某个位被置1表示相应的中断被触发,但我们知道在同一时刻内系统可以触发若干个中断,只要中断被触发了,SRCPND的相应位 ...

  3. Qt网络通信骨架解析,QtClient QtServer QtSerialPort

    http://blog.csdn.net/Dr_Abel/article/details/52469134#t18

  4. 251. Flatten 2D Vector

    题目: Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6 ...

  5. office开发心得——基于模板开发

    这几天正在写一个小程序,但用到生成word表格和Excel表格.到网上查了一些资料,发现如果生成表格模板相对比较固定即可把其制作成模板,需要设置什么格式可以直接在模板中设置,而程序仅需替换相应的内容即 ...

  6. 使用Maven创建一个Spring MVC Web 项目

    使用Maven创建java web 项目(Spring MVC)用到如下工具: 1.Maven 3.2 2.IntelliJ IDEA 13 3.JDK 1.7 4.Spring 4.1.1 rele ...

  7. yeoman错误提示

    运行 yo angular 出现如下提示: $ yo angular grunt-cli: The grunt command line interface. (v0.1.9) Fatal error ...

  8. find-all-duplicates-in-an-array(典型的数组中的重复数,不错,我做出来了,可是发现别人有更好的做法)

    https://leetcode.com/problems/find-all-duplicates-in-an-array/ 典型的数组中的重复数.这次是通过跳转法,一个个跳转排查的.因为查过的不会重 ...

  9. bzoj1562

    很明显是二分图匹配,关键是怎么求字典序最小 想到两种做法,首先是直接匹配,然后从第一位贪心调整 第二种是从最后一个倒着匹配,每次匹配都尽量选小的,这样一定能保证字典序最小 type node=reco ...

  10. asp.net获取当前页面源码并生成静态页面

    StringWriter stringWriter = new StringWriter(); HtmlTextWriter htmlWriter = new HtmlTextWriter(strin ...