博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P2023 [AHOI2009]维护序列
阅读量:5744 次
发布时间:2019-06-18

本文共 2856 字,大约阅读时间需要 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>>p; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } build(1,1,n); cin>>m; 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/10777963.html

你可能感兴趣的文章
day 10 字符编码和文件处理 细节整理
查看>>
如何打造亚秒级加载的网页1——前端性能
查看>>
「陶哲軒實分析」 習題 3.5.9
查看>>
在首次发布三周之后,MLflow迎来了0.2版本
查看>>
聊天宝彻底凉了,遭罗永浩抛弃,团队就地解散
查看>>
Composer管理PHP依赖关系
查看>>
React.js学习笔记之JSX解读
查看>>
WebPack1.x 常用功能介绍
查看>>
我所了解的Libevent和SEDA架构
查看>>
在Xcode7/7.1中使用Http请求
查看>>
Socket编程问题小记
查看>>
基于Flask-Angular的项目组网架构与部署
查看>>
JDK 11 将引入低延迟 GC,大幅度缩短 GC 暂停时长
查看>>
Rust 2018 即将到来:设法从 Rust 2015 过渡
查看>>
【图像识别】白天鹅黑天鹅灰天鹅?卷积神经网络帮你识别 ...
查看>>
js笔记
查看>>
一张图道尽程序员的出路
查看>>
Android 开发应该掌握的 Proguard 技巧
查看>>
是时候放弃 Spark Streaming, 转向 Structured Streaming 了 ...
查看>>
企业级 Spring Boot 教程 (十七)上传文件
查看>>