}voidmul(intl,intr,intnum,intx,inty,intk){if(y<l||x>r)return;if(x<=l&&r<=y){ (t[num]*=k)%=p; (ad[num]*=k)%=p; (mu[num]*=k)%=p;return; }pushdown(l,r,num);intmid=l+r>>1;mul(l,mid,num<<1,x,y,k),mul(mid+1,r,num<<1|1,x,y,k);pushup(num); }voi...
线段树解法 #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 = (...
【模板】线段树 2 - 洛谷www.luogu.com.cn/problem/P3373 思路:与线段树1相比只多一个区间乘法,因此如法炮制一个对于乘法区间更新的操作,用mul_tag代表乘法的lazy数组,用tag代表加法的lazy数组。 在又有加法又有乘法的区间更新中,push-down操作时需要考虑处理lazy数组和mul_lazy数组的先后顺序,因此有以下两种...
int mid = (l + r) >> 1; sum[ll] = (sum[ll] * lazyM[id] + lazyP[id] * (mid - l + 1)) % p; sum[rr] = (sum[rr] * lazyM[id] + lazyP[id] * (r - mid)) % p; lazyP[ll] = (lazyP[ll] * lazyM[id] + lazyP[id]) % p; lazyP[rr] = (lazyP[rr] * ...
P3373 【模板】线段树 2 乘法优先还是加法优先 ①加法优先,即规定好segtree[root*2].value=((segtree[root*2].value+segtree[root].add)*segtree[root].mul)%p,问题是这样的话非常不容易进行更新操作,假如改变一下add的数值,mul也要联动变成奇奇怪怪的分数小数损失精度,我们内心是很拒绝的; ②乘法优先,即...
洛谷P3373 模板 线段树2(线段树 懒惰传播),题目大意:有一串数an,允许对任一个区间做加法还有乘法,问某个区间的求和。例如:12345进行操作[1,3
【模板】线段树 2 - 洛谷www.luogu.com.cn/problem/P3373 思路: 区间更新既有加法又有乘法就要考虑他们的先后顺序问题。数组tree[rt]表示rt节点的值,也就是这个区间的和;mark1[rt]表示rt节点的乘法lazy标记;mark2[rt]表示rt节点的加法lazy标记。当进行区间乘以v的更新时,tree[rt]要乘v,mark1[rt]要乘...
2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含三个整数N、M、P,分别表示该数列数字的个数、操作的总个数和模数。 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。 接下来M行每行包含3或4个整数,表示一个操作,具体如下: 操作1: 格式...
操作2 : 格式:2 x y k含义:将区间 [ x , y ]内每个数加上 k 操作3 : 格式:3 x y含义:输出区间 [ x , y ]内每个数的和对 p 取模所得的结果 输出格式 输出包含若干行整数,即为所有操作 3 的结果。 输入输出样例 输入#1 5 5 38
洛谷题单指南-线段树-P3373 【模板】线段树 2 原题链接:https://www.luogu.com.cn/problem/P3373 题意解读:对于序列a[n],支持三种操作:1.对区间每个数乘上一个数 2.对区间每个数加上一个数 3.求区间和 解题思路:由于支持乘、加两种区间修改操作,是线段树的另一种典型应用:多个懒标记...