[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 ...
随机推荐
- 关于InnoDB存储引擎 text blob 大字段的存储和优化
最近在数据库优化的时候,看到一些表在设计上使用了text或者blob的字段,单表的存储空间已经达到了近100G,这种情况再去改变和优化就非常难了 一.简介 为了清楚大字段对性能的影响,我们必须要知道i ...
- Linux 系统下提取 ShellCode
未完待续 1.使用C语言编写一个获得系统Shell的小程序. #include <unistd.h> int main() { char * shell[2]; shell[0]=&quo ...
- BZOJ4556 HEOI2016/TJOI2016字符串 (后缀树+主席树)
二分答案后相当于判断一个区间的后缀与某个后缀的最长公共前缀是否能>=ans.建出后缀树,在上述问题中后者所在节点向上倍增的跳至len>=ans的最高点,然后相当于查询子树中是否有该区间的节 ...
- BZOJ4698 SDOI2008Sandy的卡片(后缀自动机)
差分后即求多串LCS.先考虑两个串怎么做.对第一个串建SAM,第二个串在上面跑即可,任意时刻走到的节点表示的都是第二个串的当前前缀在第一个串中出现的最长的后缀,具体计算长度时每走一个字符长度+1,跳f ...
- 01背包变种 第k解问题 hdu 2639
先说说普通01包的状态问题吧 普通的01背包,在状态转移的过程中为了求出最优解,一定是遍历了所有的情况 然后再求的最优解.那么对于第k最优解问题,我们只需要再加一个维度,用来记录每一个状态k优解的状态 ...
- log4j2.xml配置,导致启动报错
项目中遇到问题,当使用tomcat启动时,没问题:当使用内置tomcat启动时却报错,找不到日志路径. 变量位置: <properties> <property name=" ...
- qt连接oracle数据库
由与qt开源版本没有提供oracle数据库驱动,需要自己根据源代码来手动编译oracle驱动. 经过近三天的折腾,终于成功编译oracle驱动,连接到数据库 ps:期间经过各种失败疼苦迷茫.现在终于完 ...
- oracle exists和 not exists 的用法
比如 a,b 关联列为 a.id = b.id,现在要取 a 中的数据,其中id在b中也存在: select * from a where exists(select 1 from b where b ...
- CAS客户端认证流程
CAS登陆流程 Step 1:浏览器向CAS客户端发起登陆请求,CAS客户端生成“登陆URL”,并把浏览器重定向到该URL 登陆URL: https://${cas-server-host}:${ca ...
- ASE —— 第二次结对作业
目录 重现基线模型 基线模型原理 模型的优缺点 模型重现结果 提出改进 改进动机 新模型框架 评价合作伙伴 重现基线模型 基线模型原理 我们选用的的模型为DeepCS,接下来我将解释一下它的原理. 我 ...