线段树解法 #include<bits/stdc++.h>usingnamespacestd;constintN =1000010;intn, m, p;// 线段树模板#defineLL long long#definels u << 1#definers u << 1 | 1#definemid ((l + r) >> 1)structNode{intl, r;intmu, add; LL sum; } tr[N <<2];voidpushup(intu){ tr[u].sum = (...
故输出应为17、2(40mod38=2) 分析 区间乘与区间加操作,注意要先乘后加,pushdown函数是核心 #include<bits/stdc++.h>#defineint long longusingnamespacestd;intn,m,p;inta[100005],t[100005<<2],ad[100005<<2],mu[100005<<2];voidpushup(intnum){ t[num]=(t[num<<1]+t[num<<1|1])%p; }...
【模板】线段树 2 - 洛谷www.luogu.com.cn/problem/P3373 思路:与线段树1相比只多一个区间乘法,因此如法炮制一个对于乘法区间更新的操作,用mul_tag代表乘法的lazy数组,用tag代表加法的lazy数组。 在又有加法又有乘法的区间更新中,push-down操作时需要考虑处理lazy数组和mul_lazy数组的先后顺序,因此有以下两种...
lazy1[maxn*4],lazy2[maxn*4],sum;voidpushup(intx){a[x]=(a[2*x]+a[x*2+1])%P;}voidbuild(intl,intr,intx){intmid;if(l==r){scanf("%lld",&a[x]);a[x]%=P;return;}if(r>l){mid=(l+r)>>1;build(l,mid,2*x);build(mid+1,r,2*x+1);}pushup(x);}void...
P3373 【模板】线段树 2 乘法优先还是加法优先 ①加法优先,即规定好segtree[root*2].value=((segtree[root*2].value+segtree[root].add)*segtree[root].mul)%p,问题是这样的话非常不容易进行更新操作,假如改变一下add的数值,mul也要联动变成奇奇怪怪的分数小数损失精度,我们内心是很拒绝的; ②乘法优先,即...
操作2: 格式:2 x y k 含义:将区间[x,y]内每个数加上k 操作3: 格式:3 x y 含义:输出区间[x,y]内每个数的和对P取模所得的结果 输出格式: 输出包含若干行整数,即为所有操作3的结果。 输入输出样例 输入样例#1: 代码语言:javascript 复制 5 5 38 1 5 4 2 3 2 1 4 1 3 2 5 1 2 4 ...
其中st表示线段树,lazy[root]表示我们打的懒惰标签,l和r分别为当前线段树遍历的区间。假如只有乘标签,那么我们每个节点的更新如下: 但是,现在既有加法还有乘法,我们怎么更新一个节点呢?首先,我们知道肯定要做两个懒惰标签,其实我们在草稿纸模拟一下情况,标签有交替更新的情况,这是最难处理的。其中最难搞的是先遇到...
Luogu 3373 - 【模板】线段树 2 - [加乘线段树],题目链接:https://.luogu.org/problemnew/show/P3373题目描述如题,已知一个数列,你需要进行下面三种操作:1.将某区间每一个数乘上x2.将某区间每一个数加上x3.求出某区间每一个数的和输入格式:第一行包含三个整数N、M、P
洛⾕P3834【模板】可持久化线段树2(主席树)题⽬背景 这是个⾮常经典的主席树⼊门题——静态区间第 k k⼩。数据已经过加强,请使⽤主席树。同时请注意常数优化。题⽬描述 如题,给定 n n个整数构成的序列 a a,将对于指定的闭区间 [l,r][l,r] 查询其区间内的第 k k⼩值。输⼊格式 ...
【模板】线段树 2 正文 回到顶部 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 回到顶部 输入输出格式 输入格式: 第一行包含三个整数N、M、P,分别表示该数列数字的个数、操作的总个数和模数。