题目链接

题解

这不就是luogu的线段树2的板子吗。。。。

没有任何的区别。。。

上代码吧。。。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<set>
  8. #include<map>
  9. #include<vector>
  10. using namespace std;
  11. #define ll long long
  12. #define lson (now<<1)
  13. #define rson (now<<1|1)
  14. #define MAX 200000
  15. int a[MAX];
  16. int P,N,M;
  17. inline ll read()
  18. {
  19. ll x=0,t=1;char ch=getchar();
  20. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  21. if(ch=='-')t=-1,ch=getchar();
  22. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  23. return x*t;
  24. }
  25. struct Node
  26. {
  27. ll val,lc,lj;
  28. }t[MAX*5];
  29. void Build(int now,int l,int r)
  30. {
  31. t[now].lc=1;t[now].lj=0;
  32. if(l==r){t[now].val=a[l]%P;return;}
  33. int mid=(l+r)>>1;
  34. Build(lson,l,mid);
  35. Build(rson,mid+1,r);
  36. t[now].val=(t[lson].val+t[rson].val)%P;
  37. }
  38. void Pushdown(int now,int l,int r)
  39. {
  40. int mid=(l+r)>>1;
  41. int lsize=mid-l+1,rsize=r-mid;
  42. t[lson].val=(t[lson].val*t[now].lc+t[now].lj*lsize)%P;
  43. t[rson].val=(t[rson].val*t[now].lc+t[now].lj*rsize)%P;
  44. t[lson].lc=t[lson].lc*t[now].lc%P;
  45. t[rson].lc=t[rson].lc*t[now].lc%P;
  46. t[lson].lj=(t[lson].lj*t[now].lc+t[now].lj)%P;
  47. t[rson].lj=(t[rson].lj*t[now].lc+t[now].lj)%P;
  48. t[now].lc=1;t[now].lj=0;
  49. }
  50. void Plus(int now,int l,int r,int al,int ar,ll pp)
  51. {
  52. if(al==l&&ar==r)
  53. {
  54. t[now].lj=(t[now].lj+pp)%P;
  55. t[now].val=(t[now].val+(r-l+1)*pp)%P;
  56. return;
  57. }
  58. Pushdown(now,l,r);
  59. int mid=(l+r)>>1;
  60. if(ar<=mid)Plus(lson,l,mid,al,ar,pp);
  61. else if(al>mid)Plus(rson,mid+1,r,al,ar,pp);
  62. else {Plus(lson,l,mid,al,mid,pp);Plus(rson,mid+1,r,mid+1,ar,pp);}
  63. t[now].val=(t[lson].val+t[rson].val)%P;
  64. }
  65. void Multi(int now,int l,int r,int al,int ar,ll pp)
  66. {
  67. if(al==l&&ar==r)
  68. {
  69. t[now].val=(t[now].val*pp)%P;
  70. t[now].lj=(t[now].lj*pp)%P;
  71. t[now].lc=(t[now].lc*pp)%P;
  72. return;
  73. }
  74. Pushdown(now,l,r);
  75. int mid=(l+r)>>1;
  76. if(ar<=mid)Multi(lson,l,mid,al,ar,pp);
  77. else if(al>mid)Multi(rson,mid+1,r,al,ar,pp);
  78. else {Multi(lson,l,mid,al,mid,pp);Multi(rson,mid+1,r,mid+1,ar,pp);}
  79. t[now].val=(t[lson].val+t[rson].val)%P;
  80. }
  81. ll Query(int now,int l,int r,int al,int ar)
  82. {
  83. if(al==l&&ar==r)return t[now].val%P;
  84. Pushdown(now,l,r);
  85. int mid=(l+r)>>1;
  86. ll re=0;
  87. if(ar<=mid)re=Query(lson,l,mid,al,ar)%P;
  88. else if(al>mid)re=Query(rson,mid+1,r,al,ar)%P;
  89. else re=(Query(lson,l,mid,al,mid)+Query(rson,mid+1,r,mid+1,ar))%P;
  90. t[now].val=(t[lson].val+t[rson].val)%P;
  91. return re%P;
  92. }
  93. int main()
  94. {
  95. N=read();P=read();
  96. for(int i=1;i<=N;++i)a[i]=read();
  97. Build(1,1,N);
  98. M=read();
  99. while(M--)
  100. {
  101. int opt=read();int x=read();int y=read();
  102. if(opt==1)
  103. {
  104. ll k=read();
  105. Multi(1,1,N,x,y,k);
  106. }
  107. if(opt==2)
  108. {
  109. ll k=read();
  110. Plus(1,1,N,x,y,k);
  111. }
  112. if(opt==3)
  113. {
  114. printf("%lld\n",Query(1,1,N,x,y)%P);
  115. }
  116. }
  117. return 0;
  118. }

【BZOJ1798】【AHOI2009】维护序列(线段树)的更多相关文章

  1. BZOJ1798[Ahoi2009]维护序列——线段树

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

  2. [P2023][AHOI2009]维护序列(线段树)

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

  3. [AHOI2009]维护序列 (线段树)

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

  4. 洛谷 P2023 [AHOI2009]维护序列 || 线段树加法和乘法运算

    原理倒是非常简单.设原数为x,加法的lazytag为b,乘法的lazytag为a,操作数为c,那么原式为ax+b,乘上c后(ax+b)c=(ac)*x+b*c,加上c后(ax+b)+c=ax+(b+c ...

  5. [BZOJ1798][AHOI2009]Seq维护序列 线段树

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798 一眼看过去线段树,事实上就是线段树.对于乘和加的两个标记,我们可以规定一个顺序,比如 ...

  6. BZOJ 1798 AHOI2009 Seq 维护序列 线段树

    题目大意:维护一个序列,提供三种操作: 1.将区间中每个点的权值乘上一个数 2.将区间中每个点的权值加上一个数 3.求一段区间的和对p取模的值 2631的超^n级弱化版.写2631之前能够拿这个练练手 ...

  7. 【AHOI2009】 维护序列 - 线段树

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

  8. bzoj1798 [Ahoi2009]维护序列

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

  9. 洛谷 P2023 维护序列——线段树

    先上一波题目 https://www.luogu.org/problem/P2023 复习了一波线段树 题目涉及的操作有区间加 区间乘以及区间求和 tips:线段树在传标记的时候 优先传乘法标记再传加 ...

  10. 【线段树】Bzoj1798 [AHOI2009] 维护序列

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

随机推荐

  1. JS工厂模式开发实践

    JS工厂模式开发实践 基于JS工厂模式的H5应用,实现了轮播图功能与滑屏功能,并且实现了文字大小的自适应功能,基于SASS样式开发. 核心的JS代码如下: index.js define(functi ...

  2. [Uva10601]Cubes

    [Uva10601]Cubes 标签: 置换 burnside引理 题意 给你12跟长度相同的小木棍,每个小木棍有一个颜色.统计他们能拼成多少种不同的立方体.旋转后相同的立方体认为是相同的. 题解 这 ...

  3. 一个简单清晰的Redis操作类

    <?php /** * redis处理的二次封装 * */ class Redis{ private $_redis; private $_config; public function __c ...

  4. SpringBoot Hello World

    本文首发于我的github博客 前言 SpringBoot是Spring MVC升级版,基于『约定优于配置』的原则,快速开发出web程序. 环境 本系列笔记环境如下: Sun JDK1.8.0_20 ...

  5. PAT 1002. A+B for Polynomials

    思路:就是两个多项式做加法–指数相同的相加即可,输出的时候按照指数递减输出,并且系数为0的项不输出. AC代码 #include <stdio.h> #include <vector ...

  6. C 语言中模板的几种实现方式

    简单宏定义实现 简单宏定义 - 方式一 这种方式将主要实现部分放在一个宏定义中,利用字符替换的方式实现不同 type 的运算,详细思路见代码: simple_macro_1.c #include &l ...

  7. strcpy、strncpy与memcpy的区别与使用方法

    strcpy.strncpy.memcpy这三个C语言函数我们在主机代码编写中会很频繁的使用到,但是三个函数的区别.使用时该注意什么还是有必要说下的. 本文参考<C 标准库>编写. 一.函 ...

  8. mysql分区之range分区

    随着互联网的发展,各方面的数据越来越多,从最近两年大数据越来越强的呼声中就可见一斑. 我们所做的项目虽算不上什么大项目,但是由于业务量的问题,数据也是相当的多. 数据一多,就很容易出现性能问题,而为了 ...

  9. ubuntu14.04 64位 安装eclipse

    ubuntu14.04 64位 安装eclipse 1 在官网上下载eclipse http://www.eclipse.org/downloads/下载eclipse-jee-luna-SR1-li ...

  10. jquery Dialog弹框插件

    function Dialog(options) { var defaults = { // 默认值. title: '', // 标题文本,若不想显示title请通过CSS设置其display为no ...