bzoj 1798 [Ahoi2009]Seq 维护序列seq ——线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1798
先乘后加,就可给加法标记乘上乘法标记。
注意可能有 *0 的操作,所以 pshd 时不是 cg[ cr ]>1 而是 cg[ cr ]!=1 。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define ls Ls[cr]
#define rs Rs[cr]
using namespace std;
const int N=1e5+,M=N<<;
int n,m,mod,a[N],Ls[M],Rs[M],cg[M],jg[M],sm[M],tot;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='') ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return fx?ret:-ret;
}
int g[];
void wrt(int x)
{
if(x<)putchar('-'),x=-x;
if(!x){puts("");return;}
int t=;while(x)g[++t]=x%,x/=;
while(t)putchar(g[t]+''),t--;puts("");
}
void upd(int &x){x>=mod?x-=mod:;}
void pshp(int cr){sm[cr]=sm[ls]+sm[rs];upd(sm[cr]);}
void build(int l,int r,int cr)
{
cg[cr]=;
if(l==r){sm[cr]=a[l]%mod;return;}
int mid=l+r>>;
ls=++tot; build(l,mid,ls);
rs=++tot; build(mid+,r,rs);
pshp(cr);
}
void pshd(int cr,int l,int mid,int r)
{
if(cg[cr]!=)
{
int w=cg[cr]; cg[cr]=;
cg[ls]=(ll)cg[ls]*w%mod; cg[rs]=(ll)cg[rs]*w%mod;
jg[ls]=(ll)jg[ls]*w%mod; jg[rs]=(ll)jg[rs]*w%mod;
sm[ls]=(ll)sm[ls]*w%mod; sm[rs]=(ll)sm[rs]*w%mod;
}
if(jg[cr])
{
int w=jg[cr]; jg[cr]=;
jg[ls]+=w;upd(jg[ls]); jg[rs]+=w;upd(jg[rs]);
sm[ls]=(sm[ls]+(ll)(mid-l+)*w)%mod; sm[rs]=(sm[rs]+(ll)(r-mid)*w)%mod;
}
}
void mdfy(int l,int r,int cr,int L,int R,int k,bool fx)
{
if(l>=L&&r<=R)
{
if(!fx)
cg[cr]=(ll)cg[cr]*k%mod, sm[cr]=(ll)sm[cr]*k%mod, jg[cr]=(ll)jg[cr]*k%mod;
else
jg[cr]+=k,upd(jg[cr]),sm[cr]=(sm[cr]+(ll)(r-l+)*k)%mod;
return;
}
int mid=l+r>>; pshd(cr,l,mid,r);
if(L<=mid)mdfy(l,mid,ls,L,R,k,fx);
if(mid<R)mdfy(mid+,r,rs,L,R,k,fx);
pshp(cr);
}
int query(int l,int r,int cr,int L,int R)
{
if(l>=L&&r<=R)return sm[cr];
int mid=l+r>>,ret=; pshd(cr,l,mid,r);
if(L<=mid)ret=query(l,mid,ls,L,R);
if(mid<R)ret+=query(mid+,r,rs,L,R),upd(ret);
return ret;
}
int main()
{
n=rdn(); mod=rdn();
for(int i=;i<=n;i++)a[i]=rdn();
tot=; build(,n,);
m=rdn();
for(int i=,op,l,r,k;i<=m;i++)
{
op=rdn();l=rdn();r=rdn();
if(op==)
{
k=rdn()%mod;mdfy(,n,,l,r,k,);
}
if(op==)
{
k=rdn()%mod;mdfy(,n,,l,r,k,);
}
if(op==)
wrt(query(,n,,l,r));
}
return ;
}
bzoj 1798 [Ahoi2009]Seq 维护序列seq ——线段树的更多相关文章
- 【BZOJ1798】【AHOI2009】维护序列(线段树)
题目链接 题解 这不就是luogu的线段树2的板子吗.... 没有任何的区别... 上代码吧... #include<iostream> #include<cstdio> #i ...
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
- 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 老师交给小可可一个维护数列的任务,现在小可 ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 7773 Solved: 2792[Submit ...
- 1798: [Ahoi2009]Seq 维护序列seq
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 2930 Solved: 1087[Submit ...
- BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 5504 Solved: 1937[Submit ...
- BZOJ_1798_[AHOI2009]维护序列_线段树
BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...
- [AHOI 2009] 维护序列(线段树模板题)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...
- bzoj 1798 [Ahoi2009]Seq 维护序列seq(线段树+传标)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1798 [题意] 给定一个序列,要求提供区间乘/加,以及区间求和的操作 [思路] 线段树 ...
随机推荐
- HTML学习笔记(上)
1. HTML介绍 1.1 什么是HTML HyperText Markup Language,超文本标记语言.简单来说,HTML文件本质上就是一个文本文件,但是这个文本文件是带有标签的. 不同的标签 ...
- 前端之CSS样式
一.CSS 1.什么是CSS 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的 ...
- 跨平台移动开发 App-Framework DEMO 演示
穿越到2015 回到->MarkFan的程序员客栈 App-Framework DEMO 演示 点击APK包下载 点击Demo代码下载 官方网站 :http://app-framework- ...
- IIS部署PHP项目并与mysql完美结合
在上一篇文章中,提到iis与apache共用80端口,但是发现很多问题,例如 IIS网站有支付功能,而微信支付是不支持带有端口的网址的,虽然通过apche代理,在外面看来没有端口,可是内部还是避免不了 ...
- win10 x64下的DNW驱动不完全安装方法【转】
本文转载自:https://blog.csdn.net/sihaiwenshu/article/details/52503550 一.起因 最新心血来潮想学ARM,JZ2440开发板买回来后就开始折腾 ...
- Go goroutine (协程)
在Go语言中goroutine是一个协程,但是跟Python里面的协程有很大的不同: 在任何函数前只需要加上go关键字就可以定义为协程; 不需要在定义时区分是否是异步函数 VS async def ...
- Kubernetes Ingress
Kubernetes关于服务的暴露主要是通过NodePort方式,通过绑定node主机的某个端口,然后进行pod的请求转发和负载均衡,但这种方式下缺陷是 Service可能有很多个,如果每个都绑定一个 ...
- eclipse和myeclipse的配置(基于工作空间)
eclipse和myeclipse的配置是基于工作空间的,一旦工作空间发生改变,就需要重新配置. 以eclipse为例,新建工作空间后,选择Window--->Preferences: 1.在W ...
- C# XML对象序列化、反序列化 - PEPE YU
http://www.tuicool.com/articles/IjE7ban http://www.cnblogs.com/johnsmith/archive/2012/12/03/2799795. ...
- pandas通过字典生成dataframe
1.将一个字典输入: 该字典必须满足:value是一个list类型的元素,且每一个key对应的value长度都相同: (以该字典的key为columns) >>> import pa ...