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 ...
随机推荐
- bzoj3473字符串&bzoj3277串
题意:给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串.注意本质相同的子串多次出现算多次,如1 1 aaa这组数据答案为6,贡献1WA.代码里有些部分是为了 ...
- Tensorflow框架初尝试————搭建卷积神经网络做MNIST问题
Tensorflow是一个非常好用的deep learning框架 学完了cs231n,大概就可以写一个CNN做一下MNIST了 tensorflow具体原理可以参见它的官方文档 然后CNN的原理可以 ...
- (转)java +libsvm 安装与测试:
libsvm 用SVM实现简单线性分类 (转自:http://www.cnblogs.com/freedomshe/archive/2012/10/09/2717356.html) 0. 下载lib ...
- 【刷题】BZOJ 2539 [Ctsc2000]丘比特的烦恼
Description 随着社会的不断发展,人与人之间的感情越来越功利化.最近,爱神丘比特发现,爱情也已不再是完全纯洁的了.这使得丘比特很是苦恼,他越来越难找到合适的男女,并向他们射去丘比特之箭.于是 ...
- Android Fragment 使用详解
虽然网上有很多关于Fragment的文章,但我这里还是要写这篇笔记,因为我在编写程序的过程中发现了一个问题,至今未解决,希望得到大家的帮助: PS:当我在Fragment中定义一个名为setIndex ...
- HDU4812 D tree 【点分治 + 乘法逆元】
D树 时间限制:10000/5000 MS(Java / Others)内存限制:102400/102400 K(Java / Others) 总共提交5400个已接受的提交1144 问题描述 南京理 ...
- 快速搭建http服务:共享文件--Java的我,不知Python你的好
在 Linux 服务器上或安装了 Python 的机器上, 我们可以在指定的文件目录下,使用 python -m SimpleHTTPServer 快速搭建一个http服务,提供一个文件浏览的web ...
- props设置state误区
class Component extends React.Component { constructor(props) { super(props); this.state = { value: t ...
- BZOJ2791 Rendezvous
Description给定一个n个顶点的有向图,每个顶点有且仅有一条出边.对于顶点i,记它的出边为(i, a[i]).再给出q组询问,每组询问由两个顶点a.b组成,要求输出满足下面条件的x.y:1. ...
- mybatis的mapper的特殊符号处理
这种问题在xml处理sql的程序中经常需要我们来进行特殊处理. 其实很简单,我们只需作如下替换即可避免上述的错误: < <= > >= & ' " < ...