[Luogu] 线段树 2
https://www.luogu.org/problemnew/show/P3373
双懒标记下放
先乘后加
#include <bits/stdc++.h> using namespace std;
const int N = 1e5 + ; #define LL long long
#define lson jd << 1
#define rson jd << 1 | 1 LL w[N << ], size[N << ], fadd[N << ], fmul[N << ], Answer;
int n, Ty, Mod; #define gc getchar() inline int read() {
int x = ; char c = gc;
while(c < '' || c > '') c = gc;
while(c >= '' && c <= '') x = x * + c - '', c = gc;
return x;
} void Build_tree(int l, int r, int jd) {
size[jd] = (r - l + ); fmul[jd] = ;
if(l == r) {w[jd] = read(); w[jd] %= Mod; return ;}
int mid = (l + r) >> ;
Build_tree(l, mid, lson);
Build_tree(mid + , r, rson);
w[jd] = (w[lson] + w[rson]) % Mod;
} void Down(int jd) {
if(!fadd[jd] && fmul[jd] == ) return ;
w[lson] = w[lson] * fmul[jd] % Mod;
w[rson] = w[rson] * fmul[jd] % Mod;
w[lson] = w[lson] + fadd[jd] * size[lson] % Mod;
w[rson] = w[rson] + fadd[jd] * size[rson] % Mod;
fadd[lson] = (fadd[lson] * fmul[jd] + fadd[jd]) % Mod;
fadd[rson] = (fadd[rson] * fmul[jd] + fadd[jd]) % Mod;
fmul[lson] = fmul[lson] * fmul[jd] % Mod;
fmul[rson] = fmul[rson] * fmul[jd] % Mod;
fadd[jd] = ;
fmul[jd] = ;
} void Sec_G_mul(int l, int r, int jd, int x, int y, int imp) {
if(x <= l && r <= y) {
w[jd] = (w[jd] * imp) % Mod;
fmul[jd] = (fmul[jd] * imp) % Mod;
fadd[jd] = (fadd[jd] * imp) % Mod;
return ;
}
Down(jd);
int mid = (l + r) >> ;
if(x <= mid) Sec_G_mul(l, mid, lson, x, y, imp);
if(y > mid) Sec_G_mul(mid + , r, rson, x, y, imp);
w[jd] = (w[lson] + w[rson]) % Mod;
} void Sec_G_add(int l, int r, int jd, int x, int y, int k) {
if(x <= l && r <= y) {
w[jd] = (w[jd] + size[jd] * k) % Mod;
fadd[jd] = (fadd[jd] + k) % Mod;
return ;
}
Down(jd);
int mid = (l + r) >> ;
if(x <= mid) Sec_G_add(l, mid, lson, x, y, k);
if(y > mid) Sec_G_add(mid + , r, rson, x, y, k);
w[jd] = (w[lson] + w[rson]) % Mod;
} void Sec_A(int l, int r, int jd, int x, int y) {
if(x <= l && r <= y) {
Answer += w[jd];
if(Answer >= Mod) Answer %= Mod;
return ;
}
Down(jd);
int mid = (l + r) >> ;
if(x <= mid) Sec_A(l, mid, lson, x, y);
if(y > mid) Sec_A(mid + , r, rson, x, y);
} int main() {
n = read();
Ty = read();
Mod = read();
Build_tree(, n, );
while(Ty --) {
int opt = read();
if(opt == ) {
int x = read(), y = read(), k = read(); k %= Mod;
Sec_G_mul(, n, , x, y, k);
} else if(opt == ) {
int x = read(), y = read(), k = read(); k %= Mod;
Sec_G_add(, n, , x, y, k);
} else {
int x = read(), y = read();
Answer = ;
Sec_A(, n, , x, y);
cout << Answer << endl;
}
}
return ;
}
/*
5 5 38
1 5 4 2 3
2 1 4 1
3 2 5
1 2 4 2
2 3 5 5
3 1 4
*/
乘法标记下放的时候,加法标记也应该进行改变
这样的话,在标记下放时,先放乘法后放加法。
[Luogu] 线段树 2的更多相关文章
- 浅谈线段树 Segment Tree
众所周知,线段树是algo中很重要的一项! 一.简介 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 使用线段树可以快速的查找某一个节点在 ...
- Luogu 45887 全村最好的嘤嘤刀(线段树 树状数组)
https://www.luogu.org/problemnew/show/T45887 题目背景 重阳节到了,我们最好的八重樱拥有全村最好的嘤嘤刀…… 题目描述 在绯玉丸力量的影响下,八重村成了一条 ...
- Luogu P4643 【模板】动态dp(矩阵乘法,线段树,树链剖分)
题面 给定一棵 \(n\) 个点的树,点带点权. 有 \(m\) 次操作,每次操作给定 \(x,y\) ,表示修改点 \(x\) 的权值为 \(y\) . 你需要在每次操作之后求出这棵树的最大权独立集 ...
- Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树)
Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树) Description 一棵树上有n个节点,编号分别 ...
- NOIP 2016 天天爱跑步 (luogu 1600 & uoj 261) - 线段树
题目传送门 传送点I 传送点II 题目大意 (此题目不需要大意,我认为它已经很简洁了) 显然线段树合并(我也不知道哪来这么多显然) 考虑将每条路径拆成两条路径 s -> lca 和 t -> ...
- Luogu 3373 又乘又加的线段树
Luogu 3373 又乘又加的线段树 当给一个节点加上一个加法标记时,直接把加法标记 += 新值: 当给一个节点加上一个乘法标记时,把乘法标记和加法标记同时 *= 新值.(注意pushdown函数中 ...
- 【luogu P3372 线段树1】 模板
线段树的模板题 题目链接:https://www.luogu.org/problemnew/show/P3372 update区间修改,query区间求和 #include <iostream& ...
- luogu P2574 XOR的艺术 (线段树)
luogu P2574 XOR的艺术 (线段树) 算是比较简单的线段树. 当区间修改时.\(1 xor 1 = 0,0 xor 1 = 1\)所以就是区间元素个数减去以前的\(1\)的个数就是现在\( ...
- Luogu P1198 BZOJ 1012 最大数 (线段树)
手动博客搬家: 本文发表于20170821 14:32:05, 原地址https://blog.csdn.net/suncongbo/article/details/77449455 URL: (Lu ...
随机推荐
- prometheus+grafana监控mysql
prometheus+grafana监控mysql 1.安装配置MySQL官方的 Yum Repository(有mysql只需设置监控账号即可) [root@localhost ~]# wget - ...
- 回归损失函数:L1,L2,Huber,Log-Cosh,Quantile Loss
回归损失函数:L1,L2,Huber,Log-Cosh,Quantile Loss 2019-06-04 20:09:34 clover_my 阅读数 430更多 分类专栏: 阅读笔记 版权声明: ...
- 搭建SSM环境(淘淘商城)
本文用到的资料: 链接:https://pan.baidu.com/s/1Pk_aI_PRbqRFP9i3o9Xodg 提取码:o4o4 1.1. 数据库 1.1.1. 使用navicat创建数据库连 ...
- C#如何调用C++(进阶篇)
上一篇文章最后,提出的一个问题:如果一个c++库中有很多方法,需要一个个声明??这样岂不是要写很多代码??,而且没有智能提示看到提供了那些方法. 如下图: 如果有朋友需要用这种方式调用,而又不知道怎么 ...
- Deep Learning方向的paper
转载 http://hi.baidu.com/chb_seaok/item/6307c0d0363170e73cc2cb65 个人阅读的Deep Learning方向的paper整理,分了几部分吧,但 ...
- jQuery_jQuery的基本使用
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- was控制台无法停止应用
问题描述: was控制台无法停止应用,只能通过停止server的方式停止: 代码实现: import org.slf4j.Logger; import org.slf4j.LoggerFactory; ...
- C++线程同步之原子操作
所谓的原子操作就是指一个线程对于某一个资源做操作的时候能够保证没有其它的线程能够对此资源进行访问. 原子操作仅仅能够解决某一个变量的问题,只能使得一个整型数据做简单算术运算的时候是原子的. 以下案例需 ...
- MySQL锁表解决方法
https://blog.csdn.net/a5582ddff/article/details/79566678 MySQL锁表解决方法 一.我的处理过程 1.查进程,主要是查找被锁表的那个进程的ID ...
- vim文件时自动添加作者、时间、版权等信息
在工作中,搞运维的工程师往往会编写或完善自动化脚本时,都会手动添加表头注释,例如版权声明.作用.时间等信息提示,如果每次都手动编辑添加会大大消耗时间,所有我们可以利用快捷方法来节省时间,一种是手动在家 ...