bzoj1798: [Ahoi2009]Seq 维护序列seq 线段树
来源:互联网 发布:淘宝购物流程步骤图 编辑:程序博客网 时间:2024/05/21 10:23
好久没有写线段树了,所以看到这个题就直接写了。。。
然后发现脑残了。一直TE。。。。。然后想起来只要往下乘的时候都换成ax+b就可以了。。
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;#define getmid int mid=(l+r)>>1#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define maxn 500000typedef long long sint;sint sum[maxn];sint cal[maxn],add[maxn],mod;sint getsint(){ char c;sint res; while(c=getchar(),c<'0'||c>'9'); res=c-'0'; while(c=getchar(),c>='0'&&c<='9') res=res*10+c-'0'; return res;}int getint(){ char c;int res; while(c=getchar(),c<'0'||c>'9'); res=c-'0'; while(c=getchar(),c>='0'&&c<='9') res=res*10+c-'0'; return res;}void pushup(int rt){ sum[rt]=(sum[rt<<1]+sum[rt<<1|1])%mod;}void pushdown(int rt,int l,int r){ getmid; add[rt<<1]=((add[rt<<1]*cal[rt])+add[rt])%mod; add[rt<<1|1]=((add[rt<<1|1]*cal[rt])+add[rt])%mod; cal[rt<<1]=(cal[rt<<1]*cal[rt])%mod; cal[rt<<1|1]=(cal[rt<<1|1]%mod*cal[rt])%mod; sum[rt<<1]=(sum[rt<<1]*cal[rt]+add[rt]*(mid-l+1))%mod; sum[rt<<1|1]=(sum[rt<<1|1]*cal[rt]+add[rt]*(r-mid))%mod; add[rt]=0; cal[rt]=1;}void build(int l,int r,int rt){ getmid; cal[rt]=1; if(l==r) { sum[rt]=getint()%mod; return; } build(lson); build(rson); pushup(rt);}void update(int l,int r,int rt,int x,int y,int val){ if(x<=l&&y>=r) { add[rt]+=val; add[rt]%=mod; sum[rt]=(sum[rt]+val*(r-l+1))%mod; return; } pushdown(rt,l,r); getmid; if(x<=mid) update(lson,x,y,val); if(y>mid) update(rson,x,y,val); pushup(rt);}void multi(int l,int r,int rt,int x,int y,int val){ if(x<=l&&y>=r) { cal[rt]*=val;cal[rt]%=mod; add[rt]*=val;add[rt]%=mod; sum[rt]*=val;sum[rt]%=mod; return; } pushdown(rt,l,r); getmid; if(x<=mid) multi(lson,x,y,val); if(y>mid) multi(rson,x,y,val); pushup(rt);}sint query(int l,int r,int rt,int x,int y){ if(x<=l&&y>=r) { return sum[rt]%mod; } pushdown(rt,l,r); getmid; sint tmp=0; if(x<=mid) tmp+=query(lson,x,y); if(y>mid) tmp+=query(rson,x,y); tmp%=mod; return tmp;}int main(){ int n,m; scanf("%d%lld",&n,&mod); build(1,n,1); m=getint(); int op,a,b; sint c; while(m--) { op=getint(); if(op==1) { a=getint(); b=getint(); c=getsint()%mod; multi(1,n,1,a,b,c); } if(op==2) { a=getint(); b=getint(); c=getsint()%mod; update(1,n,1,a,b,c); } if(op==3) { a=getint(); b=getint(); printf("%lld\n",query(1,n,1,a,b)%mod); } } return 0;}
0 0
- BZOJ1798:[Ahoi2009]Seq 维护序列 线段树
- BZOJ1798 【AHOI2009】 seq维护序列 <线段树>
- 【BZOJ1798】[Ahoi2009]Seq 维护序列seq 线段树
- bzoj1798: [Ahoi2009]Seq 维护序列seq 线段树
- 【bzoj1798】[Ahoi2009]Seq 维护序列seq 线段树
- 【BZOJ1798】[Ahoi2009]Seq 维护序列seq 【线段树】
- [线段树] BZOJ1798: [Ahoi2009]Seq 维护序列seq
- [Ahoi2009]Seq 维护序列seq bzoj1798 线段树
- 线段树 BZOJ1798 [Ahoi2009]Seq 维护序列seq
- bzoj1798: [Ahoi2009]Seq 维护序列seq(线段树)
- 【bzoj1798】[Ahoi2009]Seq 维护序列seq
- bzoj1798[Ahoi2009]Seq 维护序列seq
- [BZOJ1798][Ahoi2009]Seq 维护序列seq
- [BZOJ1798] [Ahoi2009]Seq 维护序列seq
- 【AHOI2009】【BZOJ1798】Seq 维护序列seq
- BZOJ1798 [Ahoi2009]Seq 维护序列seq
- bzoj1798: [Ahoi2009]Seq 维护序列seq
- 【follow】 BZOJ1798: [Ahoi2009]Seq 维护序列seq
- 张小龙的产品观
- Android按返回键把程序退到后台而不是退出
- Tomcat 工作原理
- 第一天
- Windows搭建本地Lua开发环境
- bzoj1798: [Ahoi2009]Seq 维护序列seq 线段树
- javawed技术分析
- 托管代码与非托管代码
- android网络通讯
- 利用粘贴板技术在应用之间传递数据。
- jquery的$.extend和$.fn.extend作用及区别
- ORACLE 监听LISTENER设置的粗略介绍
- 表单提交数组时判断是否有重复的提交
- AC自动机 + 二维最短路 HDU 4511小明系列故事――女友的考验