博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P3373 【模板】线段树 2
阅读量:6945 次
发布时间:2019-06-27

本文共 2878 字,大约阅读时间需要 9 分钟。

线段树的模板,但是还应注意维护乘标记,乘法的优先级大于加法,一定记得还要取模。

#include
using namespace std;const int maxn=1000010;struct sege_tree{ int l; int r; long long lazymul; long long lazyadd; long long v;}tree[7*maxn];int a[maxn];long long p,ans;int n,m,opt,l,r;long long t;void build(int now,int l,int r){ tree[now].l=l; tree[now].r=r; tree[now].lazymul=1; tree[now].lazyadd=0; if(l==r) { tree[now].v=a[l]; return; } else { int mid=(l+r)>>1; build(now*2,l,mid); build(now*2+1,mid+1,r); tree[now].v=tree[now*2].v+tree[now*2+1].v; } tree[now].v%=p; return;}void pushdown(int now,int l,int r)//标记下传 { int mid=(l+r)>>1; tree[now*2].v=(tree[now*2].v*tree[now].lazymul+tree[now].lazyadd*(mid-l+1))%p; tree[now*2+1].v=(tree[now*2+1].v*tree[now].lazymul+tree[now].lazyadd*(r-mid))%p; tree[now*2].lazymul=(tree[now*2].lazymul*tree[now].lazymul)%p; tree[now*2+1].lazymul=(tree[now*2+1].lazymul*tree[now].lazymul)%p; tree[now*2].lazyadd=(tree[now*2].lazyadd*tree[now].lazymul+tree[now].lazyadd)%p; tree[now*2+1].lazyadd=(tree[now*2+1].lazyadd*tree[now].lazymul+tree[now].lazyadd)%p; tree[now].lazymul=1; tree[now].lazyadd=0; return;}void update1(int now,int stdl,int stdr,int l,int r,long long k){ if(l>stdr||r
=stdr) { tree[now].v=(tree[now].v*k)%p; tree[now].lazymul=(tree[now].lazymul*k)%p; tree[now].lazyadd=(tree[now].lazyadd*k)%p; return; } pushdown(now,stdl,stdr); int mid=(stdl+stdr)>>1; update1(now*2,stdl,mid,l,r,k); update1(now*2+1,mid+1,stdr,l,r,k); tree[now].v=(tree[now*2].v+tree[now*2+1].v)%p; return;}void update2(int now,int stdl,int stdr,int l,int r,long long k){ if(l>stdr||r
=stdr) { tree[now].lazyadd=(tree[now].lazyadd+k)%p; tree[now].v=(tree[now].v+k*(stdr-stdl+1))%p; return; } pushdown(now,stdl,stdr); int mid=(stdl+stdr)>>1; update2(now*2,stdl,mid,l,r,k); update2(now*2+1,mid+1,stdr,l,r,k); tree[now].v=(tree[now*2].v+tree[now*2+1].v)%p;}long long query(int now,int stdl,int stdr,int l,int r){ if(stdl>r||stdr
=l&&stdr<=r) { return tree[now].v; } pushdown(now,stdl,stdr); int mid=(stdl+stdr)>>1; return (query(now*2,stdl,mid,l,r)+query(now*2+1,mid+1,stdr,l,r))%p;}int main(){ cin>>n>>m>>p; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } build(1,1,n); while(m--) { scanf("%d",&opt); if(opt==1) { cin>>l>>r>>t; update1(1,1,n,l,r,t); } else if(opt==2) { cin>>l>>r>>t; update2(1,1,n,l,r,t); } else { cin>>l>>r; cout<
<

真的还需要耐心啊!

转载于:https://www.cnblogs.com/LJB666/p/10750963.html

你可能感兴趣的文章
选择排序
查看>>
【下一代核心技术DevOps】:(六)Rancher集中存储及相关应用
查看>>
关于AFNetWorking3.0内存泄漏的问题
查看>>
简单的一个布局CSS+DIV
查看>>
面试时要懂得说的黄金五条
查看>>
字王4K云字库入驻github
查看>>
UVa10561 Treblecross
查看>>
JS调用命令实现F11全屏
查看>>
a标签href无值,点击刷新页面解决办法
查看>>
Arm开发板+Qt学习之路
查看>>
unknown local index 'index_name' in search request
查看>>
看视频学编程之C#中的类
查看>>
C# DataGridView控件绑定数据后清空数据
查看>>
高抬贵手,拉耳复阳
查看>>
win2003 iis6 iis假死
查看>>
计算机网络知识总结
查看>>
css属性设置
查看>>
MongoDB -- JAVA基本API操作
查看>>
maven-reportng插件依赖添加
查看>>
树的存储结构实例
查看>>