我是不会说这个题很坑的。。

改了一晚上。。。

// by SiriusRen
#include <cstdio>
#define N 150000
#define LSON l,mid,lson
#define RSON mid+1,r,rson
#define LL long long
using namespace std;
LL n,m,mod,xx,yy,zz,jy;
LL mul[N*4],add[N*4],sum[N*4];
int get(){
int x=0;char p=getchar();
while(p<'0'||p>'9')p=getchar();
while(p>='0'&&p<='9')x=x*10+p-'0',p=getchar();
return x;
}
void build(int l,int r,int pos){
mul[pos]=1;
if(l==r){sum[pos]=get();return;}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
build(LSON);build(RSON);
sum[pos]=(sum[lson]+sum[rson])%mod;
}
void push_down(int pos,int lson,int rson,int num){
mul[lson]=(mul[pos]*mul[lson])%mod;
mul[rson]=(mul[pos]*mul[rson])%mod;
add[lson]=(add[lson]*mul[pos]+add[pos])%mod;
add[rson]=(add[rson]*mul[pos]+add[pos])%mod;
sum[lson]=(sum[lson]*mul[pos]+add[pos]*(num-(num>>1)))%mod;
sum[rson]=(sum[rson]*mul[pos]+add[pos]*(num>>1))%mod;
mul[pos]=1;add[pos]=0;
}
void update(int l,int r,int pos){
if(l>=xx&&r<=yy){
if(jy==1){
mul[pos]=(mul[pos]*zz)%mod;
add[pos]=(add[pos]*zz)%mod;
sum[pos]=(sum[pos]*zz)%mod;
}
else{
add[pos]=(add[pos]+zz)%mod;
sum[pos]=(sum[pos]+(r-l+1)*zz)%mod;
}
return;
}
int mid=(l+r)/2,lson=pos<<1,rson=pos<<1|1;
if(mul[pos]!=1||add[pos])
push_down(pos,lson,rson,r-l+1);
if(mid>=xx)update(LSON);
if(mid<yy)update(RSON);
sum[pos]=(sum[lson]+sum[rson])%mod;
}
int query(int l,int r,int pos){
int mid=(l+r)/2,lson=pos<<1,rson=pos<<1|1;
if(l>=xx&&r<=yy){
return sum[pos];
}
if(mul[pos]!=1||add[pos])
push_down(pos,lson,rson,r-l+1);
if(mid>=yy)return query(LSON);
else if(mid<xx)return query(RSON);
else return (query(LSON)+query(RSON))%mod;
}
int main(){
n=get();mod=get();
build(1,n,1);
m=get();
while(m--){
jy=get();xx=get();yy=get();
if(jy!=3) zz=get(),update(1,n,1);
else printf("%d\n",query(1,n,1));
}
}

AHOI 2009 (BZOJ1798)维护序列 seq (线段树好题?)的更多相关文章

  1. [AHOI 2009] 维护序列(线段树模板题)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...

  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 线段树

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

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

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

  5. bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...

  6. Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...

  7. bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)

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

  8. 【BZOJ】1798: [Ahoi2009]Seq 维护序列seq 线段树多标记(区间加+区间乘)

    [题意]给定序列,支持区间加和区间乘,查询区间和取模.n<=10^5. [算法]线段树 [题解]线段树多重标记要考虑标记与标记之间的相互影响. 对于sum*b+a,+c直接加上即可. *c后就是 ...

  9. bzoj 1798 维护序列seq 线段树

    裸的线段树,注意标签下放就行了 多么痛的领悟,一定要开int64 /************************************************************** Pro ...

  10. bzoj 1798 [Ahoi2009]Seq 维护序列seq ——线段树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1798 先乘后加,就可给加法标记乘上乘法标记. 注意可能有 *0 的操作,所以 pshd 时不 ...

随机推荐

  1. Net.Json 常用例子

    #JsonConvert 例子 内容主要都是官方的例子,加上一些中文注释而已. 主要方便自己查询,分享一份出来. 参考文档: https://www.newtonsoft.com/json/help/ ...

  2. 使用Visio—UML画类图

    在一个VS工程中,由于类的个数较多,而参数描述不是特别清晰.若此工程的生命周期较长,则有必要对工程进行完整分析,给出完整的文档.需要画出类图,并对每个成员进行详细描述. 一.画出类图 在VIsio中, ...

  3. bzoj 4994: [Usaco2017 Feb]Why Did the Cow Cross the Road III 树状数组_排序

    Description 给定长度为2N的序列,1~N各处现过2次,i第一次出现位置记为ai,第二次记为bi,求满足ai<aj<bi<bj的对数 题解: 方法一: 搞一个KDtree, ...

  4. [luogu2474 SCOI2008]天平(floyd差分约束)

    传送门 Solution 由于重量只有三种情况,那么想到用差分约束. 由于范围比较小,想到可以floyed求差分约束,暴力求天平另一边 Code #include <cstdio> #in ...

  5. CentOS7.4上搭建rocketMQ集群

    一.rocketMQ集群部署方案优缺点对比: 多Master模式(2m-noslave) : 一个集群无Slave,全是Master,例如2个Master或者3个Master 优点:配置简单,单个Ma ...

  6. iptables 实现内网转发上网

    介绍 通过iptables做nat转发实现所有内网服务器上网. 操作 首先开启可以上网的服务器上的内核路由转发功能.这里我们更改/etc/sysctl.conf 配置文件. [root@web1 /] ...

  7. 7.IDEA创建Web项目和Tomcat配置

    IntelliJ IDEA Tomcat配置 详解 Tomcat 7.0 和jdk1.8 一起使用 一.创建web项目 1.1  创建工程 1.2 创建java web项目并创建web.xml文件 1 ...

  8. jsonp 后台返回注意事项

    前端代码 <script src="http://apps.bdimg.com/libs/jquery/1.9.1/jquery.min.js"></script ...

  9. codevs——T3111 CYD啃骨头

     http://codevs.cn/problem/3111/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Desc ...

  10. Android基础新手教程——3.4 TouchListener PK OnTouchEvent + 多点触碰

    Android基础新手教程--3.4 TouchListener PK OnTouchEvent + 多点触碰 标签(空格分隔): Android基础新手教程 本节引言: 如题,本节给大家带来的是To ...