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 ...
随机推荐
- Django 2.0 学习(10):Django 定制化
定制化admin表单 通过使用admin.site.register(Question)注册Question模型,Django可以构造默认的表单.通常,可以通过对象的注册机制来告诉Django我们想要 ...
- Events-事件-红绿灯
Event: 用于线程之间状态的同步.对全局变量不断地做修改. Event=threading.Event() #生成1个event的对象 Event.wait() #等着设定全局变量.检测标志位是 ...
- CF25E:Test——题解
https://vjudge.net/problem/CodeForces-25E 题目大意:给三个字符串,求最小串,使得前三个串都是它的子串. ———————————————— 这题虽然是看哈希的时 ...
- LOJ6368:请让本题永远沉睡于此——题解
https://loj.ac/problem/6368 给一个分数,求对p=1e9+7取模的值. 给高一同学出的毒瘤模拟题,正好试试给loj传题,竟然过审了,虽然个人觉得很水,但是考试情况来看仅有一人 ...
- 学习web安全之--初识安全
随笔:随着互联网行业的飞速发展,互联网行业可谓日新月异,然而在繁华的背后,大多的互联网公司对于网络安全还是处于无重视,不作为的阶段,而作为一个程序员,如果也对信息安全视而不见的话,那将是这个公司的噩梦 ...
- Unity3D开发七惑
使用Unity3D开发也有大半年了,心中存惑如下,愿与各位开发者一起探讨: (1) 远离普适编程之惑 随着游戏引擎的不断发展,游戏程序员的开发层级也越来越高,以unity3d尤为突出.如果是进行We ...
- noip模拟赛 大芳的逆行板载
题目背景 大芳有一个不太好的习惯:在车里养青蛙.青蛙在一个n厘米(11n毫米s)的Van♂杆子上跳来跳去.她时常盯着青蛙看,以至于突然逆行不得不开始躲交叉弹.有一天他突发奇想,在杆子上每1厘米为一个单 ...
- Zabbix Server端配置文件
Zabbix Server端配置文件说明 # This is a configuration file for Zabbix Server process # To get more informat ...
- hdu 4903 The only survival
The only survival http://acm.hdu.edu.cn/showproblem.php?pid=4903 Time Limit: 40000/20000 MS (Java/Ot ...
- C11性能之道:转移和转发
1.move C++11中可以将左值强制转换为右值,从而避免对象的拷贝来提升性能.move将对象的状态或者所有权从一个对象转移到另一个对象,没有内存拷贝.深拷贝和move的区别如图: 从图可以看出,深 ...