P3373 【模板】线段树 2

    • 969通过
    • 3.9K提交
  • 题目提供者 HansBug
  • 标签 云端↑
  • 难度 提高+/省选-
  • 时空限制 1s / 128MB

题目描述

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

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:

5 5 38
1 5 4 2 3
2 1 4 1
3 2 5
1 2 4 2
2 3 5 5
3 1 4
输出样例#1:

17
2

说明

时空限制:1000ms,128M

数据规模:

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

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

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

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

样例说明:

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

思路:

  线段树模板

坑点:

  1)在更新加的时候要记得看一下爸爸的乘,必须先乘上再进行加

  2)一定要随时记得%p!!!

上代码=u=:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#define LL long long
#define lson (l+r)<<1
#define rson (l+r)<<1|1
using namespace std; const int M = ;
LL n,m,sum,p;
LL ci[M]; struct C {
LL l,r;
LL add,multiply;
LL w;
}t[M*]; LL readin()
{
LL f=,x=;char ch=getchar();
while(ch<''||ch>'')
{if(ch=='-') f=-;ch=getchar();}
while(ch<=''&&ch>='')
{x=x*+ch-'',ch=getchar();}
return (LL)x*f;
} void builds(LL l,LL r,LL k)
{
t[k].l=l,t[k].r=r;
t[k].add=,t[k].multiply=;
if(l==r)
{
t[k].w=ci[l];
return;
}
LL mid=(l+r)>>;
builds(l,mid,lson),builds(mid+,r,rson);
t[k].w=(t[lson].w+t[rson].w)%p;
} void down(LL k)
{
LL l=t[k].l,r=t[k].r;
t[lson].add=(t[lson].add*t[k].multiply+t[k].add)%p;
t[rson].add=(t[rson].add*t[k].multiply+t[k].add)%p;
t[lson].multiply=(t[lson].multiply*t[k].multiply)%p;
t[rson].multiply=(t[rson].multiply*t[k].multiply)%p;
t[lson].w=(t[k].add*(t[lson].r-t[lson].l+)%p+t[lson].w*t[k].multiply%p)%p;
t[rson].w=(t[k].add*(t[rson].r-t[rson].l+)%p+t[rson].w*t[k].multiply%p)%p;
t[k].add=,t[k].multiply=;
} void Multiply(LL a,LL b,LL k,LL cheng)
{
if(a<=t[k].l && t[k].r<=b)
{
t[k].w=t[k].w*cheng%p;
t[k].add=t[k].add*cheng%p;
t[k].multiply=t[k].multiply*cheng%p;
return;
}
down(k);
LL l=t[k].l,r=t[k].r;
LL mid=(l+r)>>;
if(a<=mid) Multiply(a,b,lson,cheng);
if(b>mid) Multiply(a,b,rson,cheng);
t[k].w=(t[lson].w+t[rson].w)%p;
} void Add(LL a,LL b,LL k,LL jia)
{
if(a<=t[k].l && t[k].r<=b)
{
t[k].add=(t[k].add+jia)%p;
t[k].w=(t[k].w+jia*(t[k].r-t[k].l+))%p;
return;
}
down(k);
LL l=t[k].l,r=t[k].r;
LL mid=(l+r)>>;
if(a<=mid) Add(a,b,lson,jia);
if(b>mid) Add(a,b,rson,jia);
t[k].w=(t[lson].w+t[rson].w)%p;
} LL Sum(LL a,LL b,LL k)
{
if(a<=t[k].l && t[k].r<=b)
return t[k].w%p;
down(k);
LL ans=;
LL l=t[k].l,r=t[k].r;
LL mid=(l+r)>>;
if(a<=mid) ans=Sum(a,b,lson)%p;
if(b>mid) ans+=Sum(a,b,rson)%p;
return ans%p;
} int main()
{
n=readin(),m=readin(),p=readin();
for(int i=;i<=n;i++)
ci[i]=readin();
builds(,n,);
LL a,b,v;
for(int i=,q;i<=m;i++)
{
scanf("%d",&q);
switch(q)
{
case :
a=readin(),b=readin(),v=readin();
Multiply(a,b,,v%p);
break;
case :
a=readin(),b=readin(),v=readin();
Add(a,b,,v%p);
break;
default:
a=readin(),b=readin();
sum=Sum(a,b,)%p;
printf("%lld\n",sum);
}
}
return ;
}

luoguP3373 【模板】线段树 2的更多相关文章

  1. hdu 1754 I Hate It (模板线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=1754 I Hate It Time Limit: 9000/3000 MS (Java/Others)    M ...

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

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

  3. hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询

    点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...

  4. 【线段树】【P3372】模板-线段树

    百度百科 Definition&Solution 线段树是一种log级别的树形结构,可以处理区间修改以及区间查询问题.期望情况下,复杂度为O(nlogn). 核心思想见百度百科,线段树即将每个 ...

  5. 算法模板——线段树6(二维线段树:区域加法+区域求和)(求助phile)

    实现功能——对于一个N×M的方格,1:输入一个区域,将此区域全部值作加法:2:输入一个区域,求此区域全部值的和 其实和一维线段树同理,只是不知道为什么速度比想象的慢那么多,求解释...@acphile ...

  6. 【洛谷 p3373】模板-线段树 2(数据结构--线段树)

    题意:已知一个数列,你需要进行下面三种操作:1.将某区间每一个数加上x:2.将某区间每一个数乘上x:3.求出某区间每一个数的和. 解法:(唉 :-(,这题卡住我了......)对于加法和乘法的混合操作 ...

  7. 【洛谷 p3372】模板-线段树 1(数据结构--线段树)

    题目:已知一个数列,你需要进行下面两种操作:1.将某区间每一个数加上x:2.求出某区间每一个数的和. 解法:如题,模版题.需要加上 lazy 标记,也就是我的 upd.lazy 标记的思路就是对一个结 ...

  8. hdu 1754 I Hate It (线段树、单点更新)(PS:ios::sync_with_stdio(false)可以加快cin、cout的读取写出速度)

    I Hate ItTime Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  9. poj 3468 A Simple Problem with Integers 线段树 题解《挑战程序设计竞赛》

    地址 http://poj.org/problem?id=3468 线段树模板 要背下此模板 线段树 #include <iostream> #include <vector> ...

  10. 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543

    学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...

随机推荐

  1. 并不对劲的复健训练-p3674

    题目大意 给出序列$ a_1,...,a_n $ ( $ n\leq10^5,a\leq 10^5 $ ),有\(m\) ( \(m\leq 10^5\))个以下三类询问: (1)给出\(l,r,k\ ...

  2. mysql解决fail to open file的方法

    由于没有安装有mysql的可视化工具,在使用cmd导入sql文件时,使用source 命令时出现 fail to open file的错误,各种查找后使用以下方法解决了: 1.首先进入mysql数据库 ...

  3. 进阶Java编程(7)反射机制

    反射机制 1,反射机制简介 在Java语言里面之所以会有如此多的开源技术支撑,很大的一部分是来自于Java最大的特征[反射机制].如果你不能够使用反射机制去进行项目的开发与设计,那么可以说你并未接触到 ...

  4. EasyUI_前台js_省市县三级联动

    1.html: <td class="tdl">所属城市</td> <td class="td_detail"> <i ...

  5. C#绘图、画笔相关

    dg.SmoothingMode = SmoothingMode.HighSpeed; //高质量 dg.PixelOffsetMode = PixelOffsetMode.HighSpeed; // ...

  6. java实现spark常用算子之Reduce

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...

  7. JSTreeShaking的webpack-deep-scope-plugin插件的应用

    webpack自身实现词法分析的JSTreeShaking webpack-depp-scope-plugin插件实现作用域分析的JSTreeShaking 一.webpack词法分析的JSTreeS ...

  8. centos7 zookeeper集群的搭建

    说明:该集群的搭建是为了服务于solr集群,请参考我的关于solr集群搭建的博客. 1.创建solr-cloud目录 mkdir /usr/local/solr-cloud 2.将解压的apache- ...

  9. 安装docker fastdfs

    # step 1: 安装必要的一些系统工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2# Step 2: 添加软件 ...

  10. Acwing 197. 阶乘分解

    给定整数 N ,试把阶乘 N! 分解质因数,按照算术基本定理的形式输出分解结果中的 pipi 和 cici 即可. 输入格式 一个整数N. 输出格式 N! 分解质因数后的结果,共若干行,每行一对pi, ...