题目链接: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. P1825 [USACO11OPEN]玉米田迷宫Corn Maze

    题目描述 This past fall, Farmer John took the cows to visit a corn maze. But this wasn't just any corn m ...

  2. Creator开源游戏、插件、教程、视频汇总

    Creator开源游戏.插件.教程.视频汇总 来源 http://forum.cocos.com/t/creator/44782 王哲首席客服   17-03-17    4   史上最全,没有之一. ...

  3. [SOJ #47]集合并卷积

    题目大意:给你两个多项式$A,B$,求多项式$C$使得:$$C_n=\sum\limits_{x|y=n}A_xB_y$$题解:$FWT$,他可以解决形如$C_n=\sum\limits_{x\opl ...

  4. 第三方库安装——lxml

    环境 操作系统:CentOS 6.7 32-bit Python:2.6.6 安装 安装依赖软件 yum -y install gcc make python-devel libxml2-devel ...

  5. HDU 3277 最大流+二分

    Marriage Match III Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  6. ARM汇编程序闪烁灯与其反汇编代码比较

    /* *LED闪烁 *led.s */ #define GPJ0CON 0xE0200240 #define GPJ0DAT 0xE0200244 .global _start //把 _start ...

  7. spring boot 在IDEA控制台中打印彩色日志

    只需要在application.properties中加入 spring.output.ansi.enabled=ALWAYS 即可

  8. ES6 利用集合Set解决数组 交集 并集 差集的问题

    根据阮一峰老师的ES6教程自己体会而写的,希望能给一些朋友有帮助到 let a = new Set([1,2,3,4]) let b = new Set([2,3,4,5,]) 并集 let unio ...

  9. Codeforces 713C Sonya and Problem Wihtout a Legend DP

    C. Sonya and Problem Wihtout a Legend time limit per test 5 seconds memory limit per test 256 megaby ...

  10. II8部署WCF服务出错

    环境:Windows 2012 R2 + IIS 8.0 + .NET 4.5 错误404.3 - Not Found: 控制面板->程序->启用或关闭Windows功能,如下图所示,将需 ...