1798: [Ahoi2009]Seq 维护序列seq

Time Limit: 30 Sec  Memory Limit: 64 MB
Submit: 5504  Solved: 1937
[Submit][Status][Discuss]

Description

老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成。 有长为N的数列,不妨设为a1,a2,…,aN 。有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值。

Input

第一行两个整数N和P(1≤P≤1000000000)。第二行含有N个非负整数,从左到右依次为a1,a2,…,aN, (0≤ai≤1000000000,1≤i≤N)。第三行有一个整数M,表示操作总数。从第四行开始每行描述一个操作,输入的操作有以下三种形式: 操作1:“1 t g c”(不含双引号)。表示把所有满足t≤i≤g的ai改为ai×c (1≤t≤g≤N,0≤c≤1000000000)。 操作2:“2 t g c”(不含双引号)。表示把所有满足t≤i≤g的ai改为ai+c (1≤t≤g≤N,0≤c≤1000000000)。 操作3:“3 t g”(不含双引号)。询问所有满足t≤i≤g的ai的和模P的值 (1≤t≤g≤N)。 同一行相邻两数之间用一个空格隔开,每行开头和末尾没有多余空格。

Output

对每个操作3,按照它在输入中出现的顺序,依次输出一行一个整数表示询问结果。

Sample Input

7 43
1 2 3 4 5 6 7
5
1 2 5 5
3 2 4
2 3 7 9
3 1 3
3 4 7

Sample Output

2
35
8

HINT

【样例说明】

初始时数列为(1,2,3,4,5,6,7)。
经过第1次操作后,数列为(1,10,15,20,25,6,7)。
对第2次操作,和为10+15+20=45,模43的结果是2。
经过第3次操作后,数列为(1,10,24,29,34,15,16}
对第4次操作,和为1+10+24=35,模43的结果是35。
对第5次操作,和为29+34+15+16=94,模43的结果是8。

测试数据规模如下表所示

数据编号 1 2 3 4 5 6 7 8 9 10
N= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000
M= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000

Source

Day1


乘法和加法

先乘后加,标记加法结合律随便算一下就好了

一直WA,随便改几个long long就A掉了.....

  1. //
  2. // main.cpp
  3. // ahoi2009
  4. //
  5. // Created by Candy on 10/11/16.
  6. // Copyright © 2016 Candy. All rights reserved.
  7. //
  8.  
  9. #include <iostream>
  10. #include <cstdio>
  11. #include <cstring>
  12. #include <algorithm>
  13. using namespace std;
  14. const int N=1e5+;
  15. typedef long long ll;
  16. #define m (l+r)/2
  17. #define lson o<<1,l,m
  18. #define rson o<<1|1,m+1,r
  19. #define lc o<<1
  20. #define rc o<<1|1
  21. inline int read(){
  22. char c=getchar();int x=,f=;
  23. while(c<''||c>''){if(c=='-')f=-;c=getchar();}
  24. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  25. return x*f;
  26. }
  27. int n,p,a[N],Q,op,l,r,x;
  28. struct node{
  29. ll sum;
  30. ll add,mul;
  31. node():add(),mul(){}
  32. }t[N<<];
  33. inline void build(int o,int l,int r){
  34. if(l==r) t[o].sum=a[l]%p;
  35. else{
  36. build(lson);
  37. build(rson);
  38. t[o].sum=(t[lc].sum+t[rc].sum)%p;
  39. }
  40. }
  41. inline void paint(int o,int l,int r,ll d,ll v){
  42. if(v!=){
  43. t[o].mul=(t[o].mul*v)%p;
  44. t[o].add=(t[o].add*v)%p;
  45. t[o].sum=(t[o].sum*v)%p;
  46. }
  47. if(d!=){
  48. t[o].add=(t[o].add+d)%p;
  49. t[o].sum=(t[o].sum+(r-l+)%p*d)%p;
  50. }
  51. }
  52. inline void pushDown(int o,int l,int r){
  53. paint(lson,t[o].add,t[o].mul);
  54. paint(rson,t[o].add,t[o].mul);
  55. t[o].add=;t[o].mul=;
  56. }
  57. inline void merge(int o){
  58. t[o].sum=(t[lc].sum+t[rc].sum)%p;
  59. }
  60. inline void mult(int o,int l,int r,int ql,int qr,int v){
  61. //printf("mult %d %d %d\n",o,l,r);
  62. if(ql<=l&&r<=qr) paint(o,l,r,,v);
  63. else{
  64. pushDown(o,l,r);
  65. if(ql<=m) mult(lson,ql,qr,v);
  66. if(m<qr) mult(rson,ql,qr,v);
  67. merge(o);
  68. }
  69. }
  70. inline void add(int o,int l,int r,int ql,int qr,int d){
  71. if(ql<=l&&r<=qr) paint(o,l,r,d,);
  72. else{
  73. pushDown(o,l,r);
  74. if(ql<=m) add(lson,ql,qr,d);
  75. if(m<qr) add(rson,ql,qr,d);
  76. merge(o);
  77. }
  78. }
  79. inline ll query(int o,int l,int r,int ql,int qr){
  80. if(ql<=l&&r<=qr) return t[o].sum;
  81. else{
  82. pushDown(o,l,r);
  83. ll ans=;
  84. if(ql<=m) ans+=query(lson,ql,qr);
  85. if(m<qr) ans+=query(rson,ql,qr);//printf("q %d %d %d %d\n",o,l,r,ans);
  86. return ans%p;
  87. }
  88. }
  89. int main(int argc, const char * argv[]){
  90. //freopen("seqb.in","r",stdin);
  91. //freopen("seqb.out","w",stdout);
  92.  
  93. n=read();p=read();
  94. for(int i=;i<=n;i++) a[i]=read();
  95. build(,,n);
  96. Q=read();
  97. for(int i=;i<=Q;i++){
  98. op=read();l=read();r=read();
  99. if(op==){
  100. x=read()%p;mult(,,n,l,r,x);
  101. }else{
  102. if(op==){
  103. x=read()%p;add(,,n,l,r,x);
  104. }else
  105. printf("%lld\n",query(,,n,l,r));
  106. }
  107. }
  108. return ;
  109. }

BZOJ1798: [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. BZOJ_1798_[AHOI2009]维护序列_线段树

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

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

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

  9. 【bzoj1798】[Ahoi2009]Seq 维护序列seq 线段树

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

随机推荐

  1. 面积(area)

    题目描述 编程计算由"*"号围成的下列图形的面积.面积计算方法是统计*号所围成的闭合曲线中点的数目.如图所示,在10*10的二维数组中,“*”围住了15个点,因此面积为15. 0 ...

  2. 使用 Visual Studio Online 进行协同开发

    Visual Studio Online(原来的 Team Foundation Service),是项目数据在云中的主页.在我们的云基础架构中只需数分钟便可启动并运行,无需安装或配置任何服务器.设置 ...

  3. Java中, 函数的调用、随机数字

    函数:     独立完成某个功能的代码模块.(方法) 作用是为了让代码结构更加良好.模块清晰,实现重用. 函数的四要素:名称,输入值,加工过程,返回值 Java中函数的语法 static 返回类型 函 ...

  4. androidstudio报错

    今天换一下IDE,结果上来就给我报错, androidstudio message:Error:java.lang.UnsupportedClassVersionError: com/android/ ...

  5. 从“黑掉Github”学Web安全开发

    Egor Homakov(Twitter: @homakov 个人网站: EgorHomakov.com)是一个Web安全的布道士,他这两天把github给黑了,并给github报了5个安全方面的bu ...

  6. Bootstrap之字体图标

    优点:1.减少请求 2.容易控制样式 所在位置:在下载的bootstrap文件中的fonts文件夹存放字体图标 默认路径为当前目录下,如需修改路径,则需在bootstrap.css中查找font-fa ...

  7. NetSuite Chinese Finance Reports

    NetSuite has a strong report customization application. The standard finance reports has a different ...

  8. 使用 Arduino 和 LM35 温度传感器监测温度

    上一篇玩儿了一下Arduino入门,这次再进一步,用一下LM35温度传感器来监测当前温度.LM35温度传感器已经在Arduino入门套件里包含了,就是那个有三个脚的小黑块儿. 我们先把这些东西连起来. ...

  9. LINUX下C-C++类软件的诊断

    一般C/C++写程序由于内存.指针等问题在后期的过程都一般会遇到内存等资源泄露.崩溃等问题,对于这些问题,一般从哪个角度解决呢? 下面从几个角度进行总结: 内存泄露 首先需要注意一个问题是top或者h ...

  10. [转]File Descriptor泄漏导致Crash: Too many open files

    在实际的Android开发过程中,我们遇到了一些奇奇怪怪的Crash,通过sigaction再配合libcorkscrew以及一些第三方的Crash Reporter都捕获不到发生Crash的具体信息 ...