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

一眼看过去线段树,事实上就是线段树。对于乘和加的两个标记,我们可以规定一个顺序,比如先乘后加。每次乘的时候利用乘法分配律就可以分别更新标记,而加就直接加上去就好了。

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int inline readint(){
int Num;char ch;
while((ch=getchar())<''||ch>'');Num=ch-'';
while((ch=getchar())>=''&&ch<='') Num=Num*+ch-'';
return Num;
}
void outint(int x){
if(x>=) outint(x/);
putchar(x%+'');
}
int N,M,P;
int sum[(<<)+],col1[(<<)+],col2[(<<)+];
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
void Pushup(int &rt){
sum[rt]=(sum[rt<<]+sum[rt<<|])%P;
}
void Build(int l,int r,int rt){
col1[rt]=;
if(l==r){
sum[rt]=readint()%P;
return;
}
int mid=l+r>>;
if(l<=mid) Build(lson);
if(r>mid) Build(rson);
Pushup(rt);
}
void Pushdown(int &rt,int &l,int &r){
if(col1[rt]!=){
col1[rt<<]=(ll)col1[rt<<]*col1[rt]%P;
col2[rt<<]=(ll)col2[rt<<]*col1[rt]%P;
sum[rt<<]=(ll)sum[rt<<]*col1[rt]%P;
col1[rt<<|]=(ll)col1[rt<<|]*col1[rt]%P;
col2[rt<<|]=(ll)col2[rt<<|]*col1[rt]%P;
sum[rt<<|]=(ll)sum[rt<<|]*col1[rt]%P;
col1[rt]=;
}
if(col2[rt]){
col2[rt<<]=(col2[rt<<]+col2[rt])%P;
sum[rt<<]=((ll)col2[rt]*((l+r>>)-l+)%P+sum[rt<<])%P;
col2[rt<<|]=(col2[rt<<|]+col2[rt])%P;
sum[rt<<|]=((ll)col2[rt]*(r-(l+r>>))%P+sum[rt<<|])%P;
col2[rt]=;
}
}
void Mul(int l,int r,int rt,int L,int R,int x){
if(l>=L&&r<=R){
col1[rt]=(ll)col1[rt]*x%P;
col2[rt]=(ll)col2[rt]*x%P;
sum[rt]=(ll)sum[rt]*x%P;
return;
}
Pushdown(rt,l,r);
int mid=l+r>>;
if(L<=mid) Mul(lson,L,R,x);
if(R>mid) Mul(rson,L,R,x);
Pushup(rt);
}
void Add(int l,int r,int rt,int L,int R,int x){
if(l>=L&&r<=R){
col2[rt]=(col2[rt]+x)%P;
sum[rt]=((ll)(r-l+)*x%P+sum[rt])%P;
return;
}
Pushdown(rt,l,r);
int mid=l+r>>;
if(L<=mid) Add(lson,L,R,x);
if(R>mid) Add(rson,L,R,x);
Pushup(rt);
}
int Qry(int l,int r,int rt,int L,int R){
if(l>=L&&r<=R) return sum[rt];
Pushdown(rt,l,r);
int mid=l+r>>,ret=;
if(L<=mid) ret=Qry(lson,L,R);
if(R>mid) ret=(ret+Qry(rson,L,R))%P;
return ret;
}
int main(){
N=readint();
P=readint();
Build(,N,);
M=readint();
for(int i=;i<=M;i++){
int opt=readint(),t,g,c;
switch(opt){
case :
t=readint();
g=readint();
c=readint()%P;
Mul(,N,,t,g,c);
break;
case :
t=readint();
g=readint();
c=readint()%P;
Add(,N,,t,g,c);
break;
case :
t=readint();
g=readint();
outint(Qry(,N,,t,g));
putchar('\n');
break;
}
}
return ;
}

[BZOJ1798][AHOI2009]Seq维护序列 线段树的更多相关文章

  1. BZOJ 1798 AHOI2009 Seq 维护序列 线段树

    题目大意:维护一个序列,提供三种操作: 1.将区间中每个点的权值乘上一个数 2.将区间中每个点的权值加上一个数 3.求一段区间的和对p取模的值 2631的超^n级弱化版.写2631之前能够拿这个练练手 ...

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

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

  3. [bzoj1798][Ahoi2009]Seq 维护序列seq ([洛谷P3373]【模板】线段树 2)

    题目大意:有$n$个数,有$m$个操作,有三种: $1\;l\;r\;x:$把区间$[l,r]$内的数乘上$x$ $2\;l\;r\;x:$把区间$[l,r]$内的数加上$x$ $3\;l\;r:$询 ...

  4. BZOJ1798[Ahoi2009]Seq 维护序列seq 题解

    题目大意: 有长为N的数列,有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值. ...

  5. 【AHOI2009】 维护序列 - 线段树

    题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...

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

    传送门 写这道题是为了get一个同时传送乘法下标和加法下标的小技巧,线段树模板题.不多说. 标记名字打错无限智力-- //BZOJ 1798 //by Cydiater //2016.9.13 #in ...

  7. BZOJ1798——[Ahoi2009]Seq维护序列seq

    1.题目大意:区间修改乘法操作和加法操作,求区间和 2.分析:为了填补bzoj2631的坑还是写一发题解吧,首先呢,既然想要双标记,但是这两个标记之间又有着制约作用,所以要定义优先级,这个优先级就定义 ...

  8. 【分块】bzoj1798 [Ahoi2009]Seq 维护序列seq

    分块,打标记,维护两个标记:乘的 和 加的. 每次 区间乘的时候,对 乘标记 和 加标记 都 乘上那个值. 每次 区间加的时候 对 加标记 加上那个值. (ax+b)*v=axv+bv.开 long ...

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

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

随机推荐

  1. CodeForces - 344D Alternating Current (模拟题)

    id=46667" style="color:blue; text-decoration:none">CodeForces - 344D id=46667" ...

  2. Page 实例的生命周期

    注册页面 · 小程序 https://developers.weixin.qq.com/miniprogram/dev/framework/app-service/page.html

  3. envoy

    微服务意味着网络更加依赖于服务抽象边界. 随着相互依赖的服务数量日渐增长,系统100%没问题的时间会变少,整个系统经常有部分功能处于降级状态.

  4. 深入研究java.lang.Object类

    前言:Java的类库日益庞大.所包括的类和接口也不计其数.但当中有一些非常重要的类和接口,是Java类库中的核心部分.常见的有String.Object.Class.Collection.ClassL ...

  5. XMU 1612 刘备闯三国之桃园结义 【二分】

    1612: 刘备闯三国之桃园结义 Time Limit: 1000 MS  Memory Limit: 128 MBSubmit: 181  Solved: 12[Submit][Status][We ...

  6. 超线程技术——超线程技术让(P4)处理器增加5%的裸晶面积,就可以换来15%~30%的效能提升,本质单核模拟双核!和异步编程的思想无异。

    超线程是Intel 所研发的一种技术,于2002年发布.超线程的英文是HT技术,全名为Hyper-Threading,中文又名超线程.超线程技术原先只应用于Intel Xeon处理器中,当时称为Sup ...

  7. linux下离线安装svn服务器并配置

    一.下载相应的包 subversion-1.8.18.tar.gz   下载地址:http://subversion.apache.orgsqlite-autoconf-3190300.tar.gz ...

  8. Masonry 比例(multipliedBy)

    前言 说到iOS自动布局,有很多的解决办法.有的人使用xib/storyboard自动布局,也有人使用frame来适配.对于前者,笔者并不喜欢,也不支持.对于后者,更是麻烦,到处计算高度.宽度等,千万 ...

  9. MkDocs -- Project documentation with Markdown

    /************************************************************************ * MkDocs -- Project docume ...

  10. wpa_supplicant drivers 查看跟踪

    /**************************************************************************** * wpa_supplicant drive ...