题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798

题解:

  高级一点的线段树,加上了区间乘法运算,则需要增加一个数组mulv记录乘的因数,在下放更新sumv和addv值的都时候要先乘再加

  被蓝书的写法坑了,就一直搞不懂下放和sumv、addv数组的具体用法,导致网上大犇们的程序我基本都看不懂,写完这道题感觉重新学了一遍线段树

 #include<cstdio>
#include<cstring>
#define MAXN 400010
#define LL long long
LL MOD,sumv[MAXN],addv[MAXN],mulv[MAXN];
int n,m,t1,y1,y2,v;
void maintain(int o,int len)//下放
{
int lc=o<<,rc=(o<<)+,M=len>>;
if(mulv[o]!=||addv[o])
{
mulv[lc]=(mulv[lc]*mulv[o])%MOD;
mulv[rc]=(mulv[rc]*mulv[o])%MOD;
addv[lc]=((addv[lc]*mulv[o])+addv[o])%MOD;
addv[rc]=((addv[rc]*mulv[o])+addv[o])%MOD;
sumv[lc]=(sumv[lc]*mulv[o]+(len-M)*addv[o])%MOD;
sumv[rc]=(sumv[rc]*mulv[o]+M*addv[o])%MOD;
}
addv[o]=;
mulv[o]=;
}
void build(int o,int L,int R)
{
int lc=o<<,rc=(o<<)+,M=(L+R)/;
if(L==R)
{
scanf("%lld",&sumv[o]);
return;
}
build(lc,L,M);
build(rc,M+,R);
sumv[o]=(sumv[lc]+sumv[rc])%MOD;
}
void update(int o,int L,int R)
{
int lc=o<<,rc=(o<<)+,M=(L+R)/;
if(y1<=L&&y2>=R)
{
if(t1==)
{
addv[o]=(addv[o]*v)%MOD;
sumv[o]=(sumv[o]*v)%MOD;
mulv[o]=(mulv[o]*v)%MOD;
}
else
{
addv[o]=(addv[o]+v)%MOD;
sumv[o]=(sumv[o]+v*(R-L+))%MOD;
}
return;
}
maintain(o,R-L+);
if(y1<=M)update(lc,L,M);
if(y2>M)update(rc,M+,R);
sumv[o]=(sumv[lc]+sumv[rc])%MOD;
}
LL query(int o,int L,int R)
{
int lc=o<<,rc=(o<<)+,M=(L+R)>>;
if(y1<=L&&y2>=R)return sumv[o]%MOD;
maintain(o,R-L+);
LL ans=;
if(y1<=M)ans=(query(lc,L,M))%MOD;
if(y2>M)ans+=(query(rc,M+,R))%MOD;
sumv[o]=(sumv[lc]+sumv[rc])%MOD;
return ans%MOD;
}
int main()
{
scanf("%d%lld",&n,&MOD);
for(int i=;i<=;i++)mulv[i]=;
build(,,n);
scanf("%d",&m);
while(m--)
{
scanf("%d%d%d",&t1,&y1,&y2);
if(t1!=)
{
scanf("%d",&v);
update(,,n);
}
else printf("%lld\n",query(,,n));
}
return ;
}

bzoj 1798 维护序列seq的更多相关文章

  1. bzoj 1798 维护序列seq 线段树

    裸的线段树,注意标签下放就行了 多么痛的领悟,一定要开int64 /************************************************************** Pro ...

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

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

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

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

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

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

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

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

  6. 1798: [Ahoi2009]Seq 维护序列seq

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

  7. bzoj 维护序列seq(双标记线段树)

    Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 4184  Solved: 1518[Submit][Status][Discus ...

  8. BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]

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

  9. BZOJ1798 维护序列seq

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

随机推荐

  1. 【bzoj4921】[Lydsy六月月赛]互质序列 暴力

    题目描述 给出一个序列,要求删除一段非空区间,使得剩下的数的个数大于等于2.求所有删除方式剩下的数的最大公约数的和. 输入 第一行包含一个正整数n(3<=n<=100000),表示序列的长 ...

  2. 【bzoj1231】[Usaco2008 Nov]mixup2 混乱的奶牛 状态压缩dp

    题目描述 混乱的奶牛[Don Piele, 2007]Farmer John的N(4 <= N <= 16)头奶牛中的每一头都有一个唯一的编号S_i (1 <= S_i <= ...

  3. 【题解】Atcoder AGC#03 E-Sequential operations on Sequence

    仙题膜拜系列...首先我们可以发现:如果在截取了一段大的区间之后再截取一段小的区间,显然是没有什么用的.所以我们可以将操作序列变成单调递增的序列. 然后怎么考虑呢?启示:不一定要考虑每一个数字出现的次 ...

  4. 【BZOJ1941】Hide and Seek(KD-Tree)

    [BZOJ1941]Hide and Seek(KD-Tree) 题面 BZOJ 洛谷 题解 \(KD-Tree\)对于每个点搜一下最近点和最远点就好了 #include<iostream> ...

  5. UVA.136 Ugly Numbers (优先队列)

    UVA.136 Ugly Numbers (优先队列) 题意分析 如果一个数字是2,3,5的倍数,那么他就叫做丑数,规定1也是丑数,现在求解第1500个丑数是多少. 既然某数字2,3,5倍均是丑数,且 ...

  6. ContestHunter暑假欢乐赛 SRM 01 - 儿童节常数赛 爆陵记

    最后15min过了两题...MDZZ 果然是不适合OI赛制啊...半场写完三题还自信满满的,还好有CZL报哪题错了嘿嘿嘿(这算不算犯规了(逃 悲惨的故事*1....如果没有CZL的话T1 10分 悲惨 ...

  7. Spring3 MVC 深入核心研究

    [转载自 http://elf8848.iteye.com/blog/875830] 目录: 一.前言 二.核心类与接口 三.核心流程图 四.DispatcherServlet说明 五.双亲上下文的说 ...

  8. JAVA、android中常用的一些jar包的作用

    正文: 这里主要介绍的是hibernate使用到的.jar Hibernate一共包括了23个jar包,令人眼花缭乱.本文将详细讲解Hibernate每个jar包的作用,便于你在应用中根据自己的需要进 ...

  9. Android实现自动定位城市并获取天气信息

    定位实现代码: <span style="font-size:14px;">import java.io.IOException; import java.util.L ...

  10. executeQuery与executeUpdate

    executeQuery就是查   executeUpdate是更新,那就是增删改,和新建     吗?