题目链接: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. Linux Shell 条件测试

    1. 文件测试 -d 目录 -s 文件非空 -f 是正规文件 -w 有写权限 -r 有读权限 -x 有执行权限 -L 符号连接 -u 文件有suid位设置

  2. 60年代进程 80年代线程 IPC How the Java Virtual Machine (JVM) Works

    小结: 1. To facilitate communication between processes, most operating systems support Inter Process C ...

  3. scrapy学习笔记:项目中 使用代理ip

    做为一个爬虫,最头疼的问题就是你的ip被封,想要在Scrapy领域无限制畅游,做好伪装是第一步,于是乎,抓取代理IP成了很多教程的开始部分.这里我说一下代理scrapy中代理ip,仅供大家借鉴! 代理 ...

  4. bzoj4631

    4631: 踩气球 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 260  Solved: 133[Submit][Status][Discuss] ...

  5. 使用VS进行打包程序解决生成两个文件的问题(压缩后只有一个exe)

    使用VS打包创建setup相信大家都挺熟的了,不熟的话网上也有很多,就不做介绍了,现在给大家写下怎么将生成的那些文件夹以及setup.exe和.msi 文件打包成一个exe 我们这里使用的是Winra ...

  6. 三步升级已安装的 Android SDK 和 ADT 插件(转载)

    转载:http://www.tfan.org/update-adt-and-android-sdk-in-five-minutes/ 如何快速地把已安装的 Android SDK 及 Eclipse ...

  7. IE浏览器下错误,不能执行已释放script的代码

    错误提示: 错误原因: 我使用layui打开子页面,用到了父页面中的一个全局变量(我用的数组),子页面关闭后,使用该数组方法(如:arr.join(",")),便提示此错误 我的解 ...

  8. bzoj 3751: [NOIP2014]解方程【数学】

    --我真是太非了,自己搞了7个质数都WA,从别人那粘5个质数就A了-- 就是直接枚举解,用裴蜀定理计算是否符合要求,因为这里显然结果很大,所以我们对多个质数取模看最后是不是都为0 #include&l ...

  9. bzoj 3830: [Poi2014]Freight【dp】

    参考:https://blog.csdn.net/zqh_wz/article/details/52953516 妙啊 看成分段问题,因为火车只能一批一批的走(易证= =)设f[i]为到i为止的车都走 ...

  10. spoj 371 Boxes【最小费用最大流】

    对于ai==0连接(i,t,1,0),对于ai>1(s,i,ai-1,0),然后对以相邻的两个点(i,j)连接(i,j,inf,1),注意这里是一个环的形式,所以1和n+1相连 #include ...