题目链接: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. ARGB,RGB颜色值表示

    转载请注明出处:http://blog.csdn.net/wei_chong_chong/article/details/50831493 今天自己定义一个控件.设置背景颜色时犯难了 如今就来总结一下 ...

  2. HTML5裁剪图片并上传至服务器实现原理讲解

    HTML5裁剪图片并上传至服务器实现原理讲解   经常做项目需要本地上传图片裁剪并上传服务器,比如会议头像等功能,但以前实现这类需求都很复杂,往往需要先把图片上传到服务器,然后返回给用户,让用户确定裁 ...

  3. 两个喜欢的"新"C#语法

    现在C#比较新的语法,我都十分喜欢. 比如属性可设默认值: public string Name { get; set; } = "张三"; 还有一个就是拼接字符串. 以往,通常都 ...

  4. PHP 7.2 RC3 on CentOS/RHEL 7.3 via Yum

    https://webtatic.com/packages/php72/ rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-lat ...

  5. linux 下RTL8723/RTL8188调试记录(命令行)【转】

    本文转载自:http://blog.h5min.cn/wuhongxin123/article/details/41820877 本文是在正确安装好wifi驱动后对系统进行的配置. 1.   配置wp ...

  6. javascript 二级联动

    <html> <head> <title></title> <meta http-equiv="Content-Type" c ...

  7. 【Idea】Debug模式

    Idea则是把手标放到你想显示结果的代码上,按Ctrl+F1就显示结果. 如果你想跳到下一个断点直接按F9

  8. JAVA web简单的登录界面jsp实现

    此次试验所用到的软件是myeclipse10,tomcat7,Dreamweaver,sqlserver2008数据库.可以实现用户使用用户名和密码登录.如果登录成功,页面会显示登录成功,如果密码错误 ...

  9. [TJOI2016&HEOI2016] 排序

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4552 [算法] 首先 , 二分答案x , 将比x小的数看作1,比x大的数看作0 然后 ...

  10. 【SCOI 2005】 扫雷

    [题目链接] 点击打开链接 [算法] 只要第一行第一个数确定了,后面的数也都确定了 递推两遍即可 [代码] #include<bits/stdc++.h> using namespace ...