题目描述

如题,已知一个数列,你需要进行下面三种操作:

1.将某区间每一个数乘上x

2.将某区间每一个数加上x

3.求出某区间每一个数的和

输入输出格式

输入格式:

第一行包含三个整数N、M、P,分别表示该数列数字的个数、操作的总个数和模数。

第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。

接下来M行每行包含3或4个整数,表示一个操作,具体如下:

操作1: 格式:1 x y k 含义:将区间[x,y]内每个数乘上k

操作2: 格式:2 x y k 含义:将区间[x,y]内每个数加上k

操作3: 格式:3 x y 含义:输出区间[x,y]内每个数的和对P取模所得的结果

输出格式:

输出包含若干行整数,即为所有操作3的结果。

输入输出样例

输入样例#1: 复制

  1. 5 5 38
  2. 1 5 4 2 3
  3. 2 1 4 1
  4. 3 2 5
  5. 1 2 4 2
  6. 2 3 5 5
  7. 3 1 4

输出样例#1: 复制

  1. 17
  2. 2

说明

时空限制:1000ms,128M

数据规模:

对于30%的数据:N<=8,M<=10

对于70%的数据:N<=1000,M<=10000

对于100%的数据:N<=100000,M<=100000

(数据已经过加强^_^)

样例说明:

故输出应为17、2(40 mod 38=2)

AC代码

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <math.h>
  6. #include <limits.h>
  7. #include <map>
  8. #include <stack>
  9. #include <queue>
  10. #include <vector>
  11. #include <set>
  12. #include <string>
  13. #define ll long long
  14. #define ull unsigned long long
  15. #define ms(a) memset(a,0,sizeof(a))
  16. #define pi acos(-1.0)
  17. #define INF 0x7f7f7f7f
  18. #define lson o<<1
  19. #define rson o<<1|1
  20. const double E=exp(1);
  21. const ll maxn=1e6+10;
  22. using namespace std;
  23. ll n,m,mod;
  24. struct wzy
  25. {
  26. ll left,right,len;
  27. ll value;
  28. ll lazy;//加法
  29. ll lazy1;//乘法
  30. }p[maxn];
  31. void push_up(ll o)
  32. {
  33. p[o].value=(p[lson].value+p[rson].value)%mod;
  34. }
  35. void push_down(ll o)
  36. {
  37. if(p[o].lazy||p[o].lazy1!=1)
  38. {
  39. p[lson].lazy=(p[lson].lazy*p[o].lazy1+p[o].lazy)%mod;
  40. p[rson].lazy=(p[rson].lazy*p[o].lazy1+p[o].lazy)%mod;
  41. p[lson].lazy1=(p[o].lazy1*p[lson].lazy1)%mod;
  42. p[rson].lazy1=(p[o].lazy1*p[rson].lazy1)%mod;
  43. p[lson].value=(p[lson].value*p[o].lazy1+p[o].lazy*p[lson].len)%mod;
  44. p[rson].value=(p[rson].value*p[o].lazy1+p[o].lazy*p[rson].len)%mod;
  45. p[o].lazy=0;
  46. p[o].lazy1=1;
  47. }
  48. }
  49. void build(ll o,ll l,ll r)
  50. {
  51. p[o].left=l;p[o].right=r;
  52. p[o].len=r-l+1;
  53. p[o].lazy=0;
  54. p[o].lazy1=1;
  55. if(l==r)
  56. {
  57. ll x;
  58. scanf("%lld",&x);
  59. p[o].value=x;
  60. return ;
  61. }
  62. ll mid=(l+r)>>1;
  63. build(lson,l,mid);
  64. build(rson,mid+1,r);
  65. push_up(o);
  66. }
  67. void update(ll o,ll l,ll r,ll v)//相加
  68. {
  69. if(p[o].left>=l&&p[o].right<=r)
  70. {
  71. p[o].lazy=(p[o].lazy+v)%mod;
  72. p[o].value=(p[o].value+v*p[o].len)%mod;
  73. return ;
  74. }
  75. push_down(o);
  76. ll mid=(p[o].left+p[o].right)>>1;
  77. if(r<=mid)
  78. update(lson,l,r,v);
  79. else if(l>mid)
  80. update(rson,l,r,v);
  81. else
  82. {
  83. update(lson,l,mid,v);
  84. update(rson,mid+1,r,v);
  85. }
  86. push_up(o);
  87. }
  88. void update1(ll o,ll l,ll r,ll v)//相乘
  89. {
  90. if(p[o].left>=l&&p[o].right<=r)
  91. {
  92. p[o].value=(p[o].value*v)%mod;
  93. p[o].lazy=(p[o].lazy*v)%mod;
  94. p[o].lazy1=(p[o].lazy1*v)%mod;
  95. return ;
  96. }
  97. push_down(o);
  98. ll mid=(p[o].left+p[o].right)>>1;
  99. if(r<=mid)
  100. update1(lson,l,r,v);
  101. else if(l>mid)
  102. update1(rson,l,r,v);
  103. else
  104. {
  105. update1(lson,l,mid,v);
  106. update1(rson,mid+1,r,v);
  107. }
  108. push_up(o);
  109. }
  110. ll query(ll o,ll l,ll r)
  111. {
  112. if(p[o].left>=l&&p[o].right<=r)
  113. return p[o].value;
  114. ll mid=(p[o].left+p[o].right)>>1;
  115. push_down(o);
  116. if(r<=mid)
  117. return query(lson,l,r);
  118. else if(l>mid)
  119. return query(rson,l,r);
  120. else
  121. return query(lson,l,mid)+query(rson,mid+1,r);
  122. }
  123. int main(int argc, char const *argv[])
  124. {
  125. ios::sync_with_stdio(false);
  126. scanf("%d%d%d",&n,&m,&mod);
  127. build(1,1,n);
  128. int _;
  129. ll a,b,c;
  130. while(m--)
  131. {
  132. scanf("%d",&_);
  133. if(_==3)
  134. {
  135. scanf("%lld%lld",&a,&b);
  136. printf("%lld\n",query(1,a,b)%mod);
  137. }
  138. else if(_==2)
  139. {
  140. scanf("%lld%lld%lld",&a,&b,&c);
  141. update(1,a,b,c);
  142. }
  143. else if(_==1)
  144. {
  145. scanf("%lld%lld%lld",&a,&b,&c);
  146. update1(1,a,b,c);
  147. }
  148. }
  149. return 0;
  150. }

洛谷 P3373:【模板】线段树 2(区间更新)的更多相关文章

  1. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  2. hdu 1556:Color the ball(线段树,区间更新,经典题)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  3. hdu 1698:Just a Hook(线段树,区间更新)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. UVA 12436-Rip Van Winkle's Code(线段树的区间更新)

    题意: long long data[250001]; void A( int st, int nd ) { for( int i = st; i \le nd; i++ ) data[i] = da ...

  5. hdu1698线段树的区间更新区间查询

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  6. HDU 1556 Color the ball(线段树:区间更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=1556 题意: N个气球,每次[a,b]之间的气球涂一次色,统计每个气球涂色的次数. 思路: 这道题目用树状数组和 ...

  7. zoj3686(线段树的区间更新)

    对线段树的区间更新有了初步的了解... A Simple Tree Problem Time Limit: 3 Seconds      Memory Limit: 65536 KB Given a ...

  8. Color the ball (线段树的区间更新问题)

    N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但 ...

  9. ZOJ 2301 Color the Ball 线段树(区间更新+离散化)

    Color the Ball Time Limit: 2 Seconds      Memory Limit: 65536 KB There are infinite balls in a line ...

  10. 线段树_区间加乘(洛谷P3373模板)

    题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上x 2.将某区间每一个数加上x 3.求出某区间每一个数的和 输入格式: 第一行包含三个整数N.M.P,分别表示该数列数字 ...

随机推荐

  1. 转:Linux环境变量设置方法总结 PATH、LD_LIBRARY_PATH

    转:  https://www.linuxidc.com/Linux/2017-03/142338.htm 文章写比较全  转载记录 Linux环境变量设置方法总结 PATH.LD_LIBRARY_P ...

  2. 使用javassist进行动态编程

    今天在研究dubbo时,发现一个新的知识点,可以使用javassist包进行动态编程,hibernate也使用该包进行编程.晚上百度了很多资料,将它的特性以代码的形式展现出来. package com ...

  3. 用mobiscroll.js的treelist实现弹出下拉效果

    首先跟上次说的一样, 第一步:引入js.css样式 1)mobiscroll-2.13.2.full.min.css 2)jquery.min.js 3)mobiscroll-2.13.2.full. ...

  4. MyEclipse常用设置和快捷键

    Java快捷键 1.注释快捷键 先敲/  再敲两个**     Enter 回车 2.system.out.println(); 常用设置 [子类继承父类] [编码字体设置] 删除当前行:ctrl+d ...

  5. 为什么使用 npm Scripts 构建项目

    http://www.css88.com/archives/7025#more-7025 https://github.com/damonbauer/npm-build-boilerplate 这个我 ...

  6. flask上传下载文件(一)下载

    简介: 作为一个可以和用户交互的web应用,必然要有数据导出功能,导出到excel是比较常用的方式. flask有一个扩展叫flask-excel,可能不适合中国人用,因为没有看到修改列名的功能.也许 ...

  7. elasticsearch基本操作之--使用QueryBuilders进行查询

    /** * 系统环境: vm12 下的centos 7.2 * 当前安装版本: elasticsearch-2.4.0.tar.gz */ QueryBuilder 是es中提供的一个查询接口, 可以 ...

  8. html回顾随笔1(*^__^*)

    1.text—align 与float 区别: float是针对div一类的容器来说.text-align是对于容器里的文本或者图片来说靠左或靠右水平对齐(vlign 竖直方向) 要注意以下几点:   ...

  9. Java基础知识补充

    基础知识总结: 学习了一段时间,重新看了孤傲苍狼的博客,对一些知识有了新的理解. unicode: 全球的文字放到计算机里面表示全是0和1,Unicode是统一了全世界国家文字的一种编码方式,用这样的 ...

  10. 内存布局:栈,堆,BSS段(静态区),代码段,数据段

    简介 我们程序运行的时候都是放在内存里的.根据静态.成员函数.代码段.对象.等等.放在不同的内存分块里.大概分为5块 1  栈 2  堆 3 BSS段-全局区-(静态区) 4 代码段 5 数据段 栈 ...