线段树模板(乘法加法一起处理哦)
来源:互联网 发布:书法坊米芾体字体 mac 编辑:程序博客网 时间:2024/04/30 06:33
这里写代码片#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>using namespace std;struct node{ long long x,y,sum,f,lazy; //f是加法,lazy是乘法 };node tree[800010];long long n,m,mod,a,b,c,d;long long num[100010];void push(long long bh) //重点 { if (tree[bh].lazy==1&&tree[bh].f==0) return; //没有下放的必要 if (tree[bh].x==tree[bh].y) //如果是叶子节点,已经做过修改 { //就把当前状态修改为上一种退出的条件 tree[bh].f=0; tree[bh].lazy=1; return; } long long ls=bh*2,rs=bh*2+1; tree[ls].sum=((tree[ls].sum*tree[bh].lazy)%mod+(tree[bh].f*(tree[ls].y-tree[ls].x+1))%mod)%mod; tree[ls].f=((tree[ls].f*tree[bh].lazy)%mod+tree[bh].f)%mod; //又注意这里的修改 tree[ls].lazy=(tree[ls].lazy*tree[bh].lazy)%mod;//还有这里<- tree[rs].sum=((tree[rs].sum*tree[bh].lazy)%mod+(tree[bh].f*(tree[rs].y-tree[rs].x+1))%mod)%mod; tree[rs].f=((tree[rs].f*tree[bh].lazy)%mod+tree[bh].f)%mod; tree[rs].lazy=(tree[rs].lazy*tree[bh].lazy)%mod; tree[bh].f=0; tree[bh].lazy=1; return;}void build(long long bh,long long l,long long r){ tree[bh].x=l; tree[bh].y=r; tree[bh].lazy=1; if (l==r) { tree[bh].sum=num[l]%mod; return; } build(bh*2,l,(l+r)/2); build(bh*2+1,(l+r)/2+1,r); tree[bh].sum=(tree[bh*2].sum+tree[bh*2+1].sum)%mod;}void cheng(long long bh,long long l,long long r,long long z){ push(bh); //先pushdown if (tree[bh].y<l||tree[bh].x>r) return; if (tree[bh].x>=l&&tree[bh].y<=r) //完全包含区间 { tree[bh].lazy=z; tree[bh].sum=(tree[bh].sum*z)%mod; return; } cheng(bh*2,l,r,z); cheng(bh*2+1,l,r,z); tree[bh].sum=(tree[bh*2].sum+tree[bh*2+1].sum)%mod;}void add(long long bh,long long l,long long r,long long z){ push(bh); if (tree[bh].x>r||tree[bh].y<l) return; if (tree[bh].x>=l&&tree[bh].y<=l) { tree[bh].f=z; tree[bh].sum=(tree[bh].sum+((tree[bh].y-tree[bh].x+1)*z)%mod)%mod; return; } add(bh*2,l,r,z); add(bh*2+1,l,r,z); tree[bh].sum=(tree[bh*2].sum+tree[bh*2+1].sum)%mod;}long long ask(long long bh,long long l,long long r){ push(bh); if (tree[bh].x>r||tree[bh].y<l) return 0; if (tree[bh].x>=l&&tree[bh].y<=r) return tree[bh].sum; long long ans=0; ans+=ask(bh*2,l,r); ans+=ask(bh*2+1,l,r); return ans%mod;}int main(){ scanf("%lld%lld%lld",&n,&m,&mod); for (int i=1;i<=n;i++) scanf("%lld",&num[i]); build(1,1,n); for (int i=1;i<=m;i++) { scanf("%lld%lld%lld",&a,&b,&c); if (a!=3) scanf("%lld",&d); if (a==1) cheng(1,b,c,d%mod); else if (a==2) add(1,b,c,d%mod); else printf("%lld\n",ask(1,b,c)); } return 0;}
1 0
- 线段树模板(乘法加法一起处理哦)
- 线段树(加法和乘法的模板)
- 线段树区间乘法+区间加法
- 大数与小数模板(乘法,加法)
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq (线段树乘法加法的混合操作)
- [jzoj]1663. 【AHOI2009】维护序列(线段树+乘法加法原理)
- 线段树多个信息的传递(加法和乘法) seq
- 把乘法变成加法 模板
- 大数的阶乘(乘法)及加法(详细模板)
- 模板类Matrix with 加法、乘法
- 高精度 大数加法 乘法 除法 幂 模板
- 大数加法和大数乘法模板函数
- 高精度 大数加法 乘法 除法 幂 模板
- 【矩阵的乘法和加法模板】
- uva 424 Integer Inquiry(高精度加法模板) uva 10106 Product(高精度乘法模板)
- bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和
- 大数乘法(加法)运算
- 高精度(乘法和加法)
- 第一周:Linux初学者笔记
- 极限
- siphome组成
- 01背包采药问题 模版
- 博为峰JavaEE技术文章 ——MyBatis @param使用方法
- 线段树模板(乘法加法一起处理哦)
- Linux学习----1
- 数组的排序:冒泡排序、选择排序
- 九度OJ学习笔记 题目1096
- test1
- 算法训练 数组排序去重
- Spring-ApplicationContext事件机制
- Linux基础知识
- OpenSSl