线段树乘法取%版
来源:互联网 发布:打怪升级的网络手游 编辑:程序博客网 时间:2024/06/12 00:19
没什么好说的0.0,直接贴代码。
#include<bits/stdc++.h>using namespace std;const int MAXN=100005;long long a[MAXN];long long sumv[MAXN<<2],lzt[MAXN<<2],sst[MAXN<<2];long long mod;struct xds{#define lson (o<<1)#define rson (o<<1|1)#define mid ((l+r)>>1)inline void pushdown(int o,int l,int r){ if(sst[o]!=1){ lzt[lson]=(lzt[lson]*sst[o])%mod;lzt[rson]=(lzt[rson]*sst[o])%mod; sumv[lson]=sumv[lson]*sst[o]%mod;sumv[rson]=sumv[rson]*sst[o]%mod; sst[lson]=sst[lson]*sst[o]%mod;sst[rson]=sst[rson]*sst[o]%mod; sst[o]=1; } if(lzt[o]){ sumv[lson]=(sumv[lson]+((mid-l+1)*lzt[o]))%mod;sumv[rson]=(sumv[rson]+((r-mid)*lzt[o]))%mod; lzt[lson]=(lzt[lson]+lzt[o])%mod;lzt[rson]=(lzt[rson]+lzt[o])%mod; lzt[o]=0; }}inline void pushup(int o){sumv[o]=(sumv[lson]+sumv[rson])%mod;}inline void buildt(int o,int l,int r){ lzt[o]=0; sst[o]=1; if(l==r){sumv[o]=a[l];return;} buildt(lson,l,mid); buildt(rson,mid+1,r); pushup(o);}inline long long query(int o,int l,int r,int ql,int qr){ if(ql<=l&&qr>=r){return sumv[o];} long long ans=0; pushdown(o,l,r); if(ql<=mid)ans=(ans+query(lson,l,mid,ql,qr))%mod; if(qr>mid)ans=(ans+query(rson,mid+1,r,ql,qr))%mod; return ans%mod;}inline void add(int o,int l,int r,int ql,int qr,long long v){ if(ql<=l&&qr>=r){sumv[o]=(sumv[o]+(r-l+1)*v)%mod;lzt[o]=(lzt[o]+v)%mod;return;} pushdown(o,l,r); if(ql<=mid)add(lson,l,mid,ql,qr,v); if(qr>mid)add(rson,mid+1,r,ql,qr,v); pushup(o);}inline void mut(int o,int l,int r,int ql,int qr,long long v){ if(ql<=l&&qr>=r){lzt[o]=(lzt[o]*v)%mod;sumv[o]=sumv[o]*v%mod;sst[o]=sst[o]*v%mod;return;} pushdown(o,l,r); if(ql<=mid)mut(lson,l,mid,ql,qr,v); if(qr>mid)mut(rson,mid+1,r,ql,qr,v); pushup(o);}
};
int n,m,tem,tem1,tem2;long long tem4;int main(){xds wa;scanf("%d%d%d",&n,&m,&mod);for(int i=1;i<=n;i++){ scanf("%lld",&a[i]);}wa.buildt(1,1,n);for(int i=1;i<=m;i++){ scanf("%d",&tem); if(tem==1){ scanf("%d%d%lld",&tem1,&tem2,&tem4); wa.mut(1,1,n,tem1,tem2,tem4); } if(tem==2){ scanf("%d%d%lld",&tem1,&tem2,&tem4); wa.add(1,1,n,tem1,tem2,tem4); } if(tem==3){ scanf("%d%d",&tem1,&tem2); cout<<wa.query(1,1,n,tem1,tem2)<<endl; }}return 0;
}
阅读全文
0 0
- 线段树乘法取%版
- HDU 5475 线段树 + 乘法+取模
- ZOJ(矩阵乘法+线段树)
- Codeforces719E 矩阵乘法+线段树
- zoj 2671 Cryptography(线段树+矩阵乘法)
- 线段树+矩阵乘法(ZOJ3772)
- HDU5239(线段树,找规律,快速乘法)
- 线段树2(带有乘法标记)
- ZOJ 2671 (线段树+矩阵乘法)
- 线段树区间乘法+区间加法
- poj3225 线段树~取反操作
- FZU 2136 取糖果(线段树)
- fzu 2136 取糖果(线段树)
- FZU2136--取糖果 (线段树+RMQ)
- 线段树区间取max黑科技
- zoj3886(线段树,区间取模)
- zoj3772--【水题】线段树区间查询+矩阵乘法
- acm 乘法逆元 或线段树 UVALive 5798
- 一起来学SpringCloud之
- 2017年10月25日作业
- vue小结笔记(4)之v-resource应用
- imageview+handler+gridview+上拉下拉
- 电商购物
- 线段树乘法取%版
- Android popwindow简单实现弹框
- 用OpenCV检测图像中的长方形画布或纸张并提取图像内容
- android杂项笔记,关于横屏纵屏问题,混淆问题备份
- JavaScript实时反馈系统时间
- Codeforces-877E:Danil and a Part-time Job(DFS序列+线段树)
- 全局捕获异常类
- 各大公司Java后端开发面试题总结
- 素数