bzoj 1798 维护序列seq
题目链接: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的更多相关文章
- bzoj 1798 维护序列seq 线段树
裸的线段树,注意标签下放就行了 多么痛的领悟,一定要开int64 /************************************************************** Pro ...
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 7773 Solved: 2792[Submit ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...
- Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...
- 1798: [Ahoi2009]Seq 维护序列seq
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 2930 Solved: 1087[Submit ...
- bzoj 维护序列seq(双标记线段树)
Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 4184 Solved: 1518[Submit][Status][Discus ...
- BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 5504 Solved: 1937[Submit ...
- BZOJ1798 维护序列seq
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 8058 Solved: 2964[Submit ...
随机推荐
- BZOJ1229 & 洛谷2917:[USACO2008 NOV]toy 玩具 & 洛谷4480:[BJWC2018]餐巾计划问题——题解
标题很长emmm…… [USACO2008 NOV]toy 玩具 https://www.luogu.org/problemnew/show/P2917 https://www.lydsy.com/J ...
- 无序数组中第Kth大的数
题目:找出无序数组中第Kth大的数,如{63,45,33,21},第2大的数45. 输入: 第一行输入无序数组,第二行输入K值. 该是内推滴滴打车时(2017.8.26)的第二题,也是<剑指of ...
- 实验三 Java敏捷开发与XP实践
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:陈巧然 ...
- POJ.1061 青蛙的约会 (拓展欧几里得)
POJ.1061 青蛙的约会 (拓展欧几里得) 题意分析 我们设两只小青蛙每只都跳了X次,由于他们相遇,可以得出他们同余,则有: 代码总览 #include <iostream> #inc ...
- Python3简单入门
在Mac和Linux上运行Python时,请打开终端,然后运行python3 Mac OSX 正确地同时安装Python 2.7 和Python3: http://www.jianshu.com/p ...
- 笔记-树形dp
this is not a 正经的note you may not understand Problem 1:二叉树,有权,要选它父亲才能选它,$n\leq200,m\leq500$ I: $dp_{ ...
- mysql语句进阶
1.null mysql> create table worker(id int not null,name varchar(8) not null,pass varchar(20) not n ...
- linux查找文件目录及mysql卸载
我们要卸载 mysql但是不知道其安装在哪里了,可以用 where +关键词 的方式查找,如上图 输入 whereis mysql 后,下面显示出了4个包含mysql的位置. ..... 查看安装m ...
- HDU2819:Swap(二分图匹配)
Swap Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- SQLite 学习笔记
SQLite 学习笔记. 一.SQLite 安装 访问http://www.sqlite.org/download.html下载对应的文件. 1.在 Windows 上安装 SQLite. ...