BZOJ1798
来源:互联网 发布:绵阳广播电视网络 编辑:程序博客网 时间:2024/06/09 17:47
传送门:BZOJ1798
双状态的线段树,注意优先级。
#include <cstdio>#include <cstdlib>#include <iostream>#include <algorithm>#include <cstring>using namespace std;struct Node{ int ls,rs; long long w; long long add; long long times; Node(){ ls=rs=0; w=0; add=0; times=1; }};long long p;Node tree[200005];int y1,y2;int root,num;int da[100005];int m,n;void PushDown(int root){ tree[tree[root].ls].add=tree[tree[root].ls].add*tree[root].times+tree[root].add; tree[tree[root].rs].add=tree[tree[root].rs].add*tree[root].times+tree[root].add; tree[tree[root].ls].times*=tree[root].times; tree[tree[root].rs].times*=tree[root].times; tree[tree[root].ls].add%=p; tree[tree[root].rs].add%=p; tree[tree[root].ls].times%=p; tree[tree[root].rs].times%=p; tree[root].times=1;tree[root].add=0;}void Maintain(int root,int l,int r){ tree[root].w=tree[tree[root].ls].w+tree[tree[root].rs].w; tree[root].w*=tree[root].times; tree[root].w+=(r-l+1)*tree[root].add; tree[root].w%=p;}void Update(int root,int l,int r,int addv,int timesv){ if(y1<=l&&r<=y2){ if(addv!=-1) tree[root].add+=addv; else{ tree[root].add*=timesv; tree[root].times*=timesv; } tree[root].add%=p; tree[root].times%=p; } else{ PushDown(root); int mid=(l+r)/2; if(y1<=mid) Update(tree[root].ls,l,mid,addv,timesv); else Maintain(tree[root].ls,l,mid); if(mid<y2) Update(tree[root].rs,mid+1,r,addv,timesv); else Maintain(tree[root].rs,mid+1,r); } Maintain(root,l,r);}long long Query(int root,int l,int r){ if(y1<=l&&r<=y2) return tree[root].w%p; int mid=(l+r)/2; PushDown(root); Maintain(tree[root].ls,l,mid); Maintain(tree[root].rs,mid+1,r); Maintain(root,l,r); long long ans=0; if(y1<=mid) ans+=Query(tree[root].ls,l,mid); if(mid<y2) ans+=Query(tree[root].rs,mid+1,r); return ans%p;}void MakeTree(int&root,int l,int r){ root=++num; if(l==r) return; int mid=(l+r)/2; MakeTree(tree[root].ls,l,mid); MakeTree(tree[root].rs,mid+1,r);}void Readdata(){ scanf("%d",&n); cin>>p; for(int i=1;i<=n;i++) scanf("%d",&da[i]);}void Solve(){ for(int i=1;i<=n;i++){ y1=y2=i; Update(root,1,n,da[i],1); } scanf("%d",&m); for(int i=1;i<=m;i++){ int a,t,g,c; scanf("%d",&a); if(a==1){ scanf("%d%d%d",&y1,&y2,&c); Update(root,1,n,-1,c); } if(a==2){ scanf("%d%d%d",&y1,&y2,&c); Update(root,1,n,c,1); } if(a==3){ scanf("%d%d",&y1,&y2); printf("%lld\n",Query(root,1,n)); } }}int main(){ Readdata(); MakeTree(root,1,n); Solve(); return 0;}
0 0
- BZOJ1798
- bzoj1798题解
- bzoj1798 AHOI2009seq
- BZOJ1798 维护序列seq
- bzoj1798【ahoi2009】维护序列
- BZOJ1798行星序列
- 【AHOI2009】bzoj1798 维护序列
- 【Bzoj1798】维护序列seq
- BZOJ1798 AHOI2009 维护数列
- 【BZOJ1798】【AHOI2009】维护序列
- 【bzoj1798】[Ahoi2009]Seq 维护序列seq
- bzoj1798[Ahoi2009]Seq 维护序列seq
- [BZOJ1798]AHOI2009 维护序列|线段树|splay
- [BZOJ1798][Ahoi2009]Seq 维护序列seq
- [BZOJ1798] [Ahoi2009]Seq 维护序列seq
- Bzoj1798 AHOI2009 维护序列 线段树模版
- 【AHOI2009】【BZOJ1798】Seq 维护序列seq
- BZOJ1798:[Ahoi2009]Seq 维护序列 线段树
- Gym 100712HBridges(桥+缩点+树的直径)
- Android百度地图SDK 导航初始化和地图初始化引起的冲突
- 手动扩栈
- PHP—— 跨域 HTTP 请求
- Drainage Ditches
- BZOJ1798
- codeforces 250 div1 D
- android 第三方收集
- uva 10570 meeting with aliens
- float double的精度以及与0比较
- Java学习笔记(十二):泛型的使用
- hdu 2066 一个人的旅行
- hdu 1875 畅通工程再续 (最小生成树)
- 学习笔记