5039: [Jsoi2014]序列维护

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 282  Solved: 169
[Submit][Status][Discuss]

Description

JYY 有一个维护数列的任务。 他希望你能够来帮助他完成。
JYY 现在有一个长度为 N 的序列 a1,a2,…,aN,有如下三种操作:
1、 把数列中的一段数全部乘以一个值;
2、 把数列中的一段数全部加上一个值;
3、 询问序列中的一段数的和。
由于答案可能很大,对于每个询问,你只需要告诉 JYY 这个询问的答案对 P
取模的结果即可。

Input

第一行包含两个正整数, N 和 P;
第二行包含 N 个非负整数,从左到右依次为 a1,a2,…,aN。
第三行有一个整数 M,表示操作总数。
接下来 M 行,每行满足如下三种形式之一:
1、“ 1 t g c”(不含引号)。表示把所有满足 t ≤ i ≤ g 的 ai 全部乘以 c;
2、“ 2 t g c”(不含引号)。表示把所有满足 t ≤ i ≤ g 的 ai 全部加上 c;
3、“ 3 t g”(不含引号)。表示询问满足 t ≤ i ≤ g 的 ai 的和对 P 取模的值。
1 ≤ N,M ≤ 10^5, 1 ≤ P, c, ai ≤ 2*10^9, 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
【样例说明】
初始时数列为(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。
 
 
不就是个线段树模板吗QAQ,然后。。。。。

 /**************************************************************
Problem: 5039
User: Hammer_cwz_77
Language: C++
Result: Accepted
Time:6100 ms
Memory:10276 kb
****************************************************************/ #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
LL mod;
struct node
{
int l,r,lc,rc;
LL c;
LL mul,add;
bool lazy;
node(){lazy=false;}
}tr[];int trlen;
int n,m;int x[];
void bt(int l,int r)
{
int now=++trlen;
tr[now].l=l;tr[now].r=r;
tr[now].lc=tr[now].rc=-;tr[now].c=;
tr[now].mul=;tr[now].add=;
if(l==r){tr[now].c=x[l]%mod;return ;}
if(l<r)
{
int mid=(l+r)/;
tr[now].lc=trlen+; bt(l,mid);
tr[now].rc=trlen+; bt(mid+,r);
}
tr[now].c=tr[tr[now].lc].c+tr[tr[now].rc].c;
}
void lazy(int x)
{
int lc=tr[x].lc,rc=tr[x].rc;
int l=tr[x].l,r=tr[x].r;int mid=(l+r)/;
if(lc!=-)
{
tr[lc].c=(tr[lc].c*tr[x].mul)%mod;
tr[lc].c=(tr[lc].c+tr[x].add*(mid-l+))%mod;
tr[lc].mul=(tr[lc].mul*tr[x].mul)%mod;
tr[lc].add=(tr[lc].add*tr[x].mul)%mod;
tr[lc].add=(tr[lc].add+tr[x].add)%mod;
}
if(rc!=-)
{
tr[rc].c=(tr[rc].c*tr[x].mul)%mod;
tr[rc].c=(tr[rc].c+tr[x].add*(r-mid))%mod;
tr[rc].mul=(tr[rc].mul*tr[x].mul)%mod;
tr[rc].add=(tr[rc].add*tr[x].mul)%mod;
tr[rc].add=(tr[rc].add+tr[x].add)%mod;
}
tr[x].mul=;tr[x].add=;
}
void change_x(int now,int l,int r,LL c)//l~r +c
{
if(tr[now].l==l && tr[now].r==r)
{
tr[now].c=(tr[now].c+(r-l+)*c)%mod;
tr[now].add=(tr[now].add+c)%mod;
return ;
}
int lc=tr[now].lc,rc=tr[now].rc;
int mid=(tr[now].l+tr[now].r)/;
lazy(now);
if(r<=mid)change_x(lc,l,r,c);
else if(mid+<=l)change_x(rc,l,r,c);
else
{
change_x(lc,l,mid,c);
change_x(rc,mid+,r,c);
}
tr[now].c=(tr[lc].c+tr[rc].c)%mod;
}
void change_a(int now,int l,int r,LL c)//l~r *c
{
if(tr[now].l==l && tr[now].r==r)
{
tr[now].c=(tr[now].c*c)%mod;
tr[now].mul=(tr[now].mul*c)%mod;
tr[now].add=(tr[now].add*c)%mod;
return ;
}
int lc=tr[now].lc,rc=tr[now].rc;
int mid=(tr[now].l+tr[now].r)/;
lazy(now);
if(r<=mid)change_a(lc,l,r,c);
else if(mid+<=l)change_a(rc,l,r,c);
else
{
change_a(lc,l,mid,c);
change_a(rc,mid+,r,c);
}
tr[now].c=(tr[lc].c+tr[rc].c)%mod;
}
LL findsum(int now,int l,int r)
{
if(tr[now].l==l && tr[now].r==r)
{
lazy(now);
return tr[now].c%mod;
}
int lc=tr[now].lc,rc=tr[now].rc;
int mid=(tr[now].l+tr[now].r)/;
lazy(now);
if(r<=mid)return findsum(lc,l,r);
else if(mid+<=l)return findsum(rc,l,r);
else return ((findsum(lc,l,mid)%mod+findsum(rc,mid+,r)%mod)%mod);
}
int main()
{
scanf("%d%lld",&n,&mod);
for(int i=;i<=n;i++)scanf("%d",&x[i]);
trlen=;bt(,n);
scanf("%d",&m);
while(m--)
{
int q,t,g;LL c;
scanf("%d%d%d",&q,&t,&g);
if(q==){printf("%lld\n",findsum(,t,g)%mod);continue;}
scanf("%lld",&c);
if(q==)change_a(,t,g,c);
else change_x(,t,g,c);
}
return ;
}

---恢复内容结束---

BZOJ 5039: [Jsoi2014]序列维护的更多相关文章

  1. bzoj5039:[Jsoi2014]序列维护

    做做bzoj上的新题(不存在的) 同bzoj1798: [Ahoi2009]维护序列,样例都一样的...我能想象到的唯一的新的考察意义就是模数是2e9不是1e9,于是加法的时候需要转long long ...

  2. 「JSOI2014」序列维护

    「JSOI2014」序列维护 传送门 其实这题就是luogu的模板线段树2,之所以要发题解就是因为学到了一种比较NB的 \(\text{update}\) 的方式.(参见这题) 我们可以把修改操作统一 ...

  3. [BZOJ 4350]括号序列再战猪猪侠 题解(区间DP)

    [BZOJ 4350]括号序列再战猪猪侠 Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个 ...

  4. (WAWAWAWAWAWA) BZOJ 1858: [Scoi2010]序列操作

    二次联通门 : BZOJ 1858: [Scoi2010]序列操作 /* BZOJ 1858: [Scoi2010]序列操作 已经... 没有什么好怕的的了... 16K的代码... 调个MMP啊.. ...

  5. BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )

    线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...

  6. bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 7773  Solved: 2792[Submit ...

  7. bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...

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

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

  9. Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)

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

随机推荐

  1. MySQL绿色版安装

    下载MySQL绿色版 去官方下载mysql.,我下载的是 mysql-5.6.27-winx64,下载后解压缩到D:盘. 安装MySQL服务 拷贝my-default.ini重命名为my.ini,修改 ...

  2. shell编程之运算符(3)

    declare声明变量类型 declare[+/-][选项]变量名 选项: - : 给变量设定类型属性 + : 取消变量的类型属性 -a : 将变量声明为数组型 -i : 将变量声明为整数型(inte ...

  3. Java String使用总结

    1 == 与 equals() 使用==来比较两个primitive主数据类型在意义上相等(是否带有相同的字节组合),或者判断两个引用(如String变量)是否引用同一个对象.使用equals()来判 ...

  4. win7局域网共享文件

    调整共享文件所在电脑设置: 1. 关闭防火墙 2. 更改网络设置 ①打开网络和共享中心 ②进入"选择家庭组和共享选项" ③进入"更改高级共享设置" ④调整设置并 ...

  5. Windows 桌面和文件夹的右键->打开命令行窗口

    Windows 桌面和文件夹的右键->打开命令行窗口 1.先按下shift,再点鼠标右键运行CMD,(不是管理员权限) 上图是我已经加了右键的,并且 系统设置了  ps代替cmd,所以是“在此处 ...

  6. Activiti获取ProcessEngine的三种方法

    1.通过ProcessEngineConfiguration获取 package cn.lonecloud.mavenActivi; import org.activiti.engine.Proces ...

  7. CentOs下Mongodb的下载与安装

    1.下载MongoDB(64位) http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.9.tgz tar zxvf mongodb-lin ...

  8. 老男孩Python全栈开发(92天全)视频教程 自学笔记19

    day19 课程内容: 第19天的课程就是复习一些正则表达式,以及说一下计算器的思路,我就把我做的计算器代码当这一天的内容吧. 计算器作业:不eval函数,计算能计算:'1-2*((60-30-8*( ...

  9. 3.1 if 条件分支语句

    Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 获取条件语句的执行结果的过程就是真假值判断 #首先需要说明在Python中 #假值(False):0. ...

  10. LOJ6002 - 「网络流 24 题」最小路径覆盖

    原题链接 Description 求一个DAG的最小路径覆盖,并输出一种方案. Solution 模板题啦~ Code //「网络流 24 题」最小路径覆盖 #include <cstdio&g ...