假设法做线段树

合并lazy-tag:指的是把一些能合并的合并了,如果有多种 lazy-tag 的话,每一层最多只存在一个tag。

下面,这是一道区间乘与区间加的混合。

P3373 【模板】线段树 2 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P3373

ps:(sum、add、len、mul,分别表示当前区间的区间和、加标记、长度,乘标记)

总的说来,我们可以把这道题分为两种情况:

1、先加后乘: sum = (sum+add*len ) * mul  

2、先乘后加: sum = sum*mul +add*len  

然后尝试一下能不能合并为一种情况。

对于1,我们只要把它展开: sum = sum*mul + add*mul * len

我们发现,这两种形式是相同的。

我们就可以考虑将他们写在同一个pushdown里面。

这样向下传递完了之后,mul和add标记都被清除

所以我们的pushdown可以这样写:

void pushdown1(int pos) {ll mid = (L + R) >> 1;Lv = ((Lv * Mul) + Add * (mid - L + 1)) % mod;Rv = ((Rv * Mul) + Add * (R -mid)) % mod;LMul = (LMul * Mul) % mod;RMul = (RMul * Mul) % mod;LAdd = (LAdd*Mul  + Add) % mod;RAdd = (RAdd*Mul  + Add) % mod;Add = 0;Mul = 1;}

这时候,又有疑问了,因为我们只有在先加后乘的情况下,左右儿子的加法标记才能更新为:LAdd*Mul + Add 的形式啊。

为什么 先乘后加 和 先加后乘 共用一个 pushdown?

先乘后加中下传的add为什么要乘mul?

正是因为它们形式是一样的,共用了一个pushdown后可以同时清除两个标记,然后诡异的使得每个pos中只有一个标记!

这个很抽象,请往下看。

在这道题中:

要么没有标记,要么只有加标记,要么只有乘标记。

如果是先乘后加,那么其实乘标记的值是1.

所以不会影响正确的值。

那我是怎么得出这个结论的呢?

// 乘法操作
void mul(int pos, int ql, int qr, int val) {pushdown1(pos);if (ql <= L and qr >= R) {Mul = (Mul * val) % mod;V = (V * val) % mod;return;}ll mid = (L + R) >> 1;if (ql <= mid)mul(lson, ql, qr, val);if (qr > mid)mul(rson, ql, qr, val);pushup(pos);return;
}//加法操作
void add(int pos, int ql, int qr, int val) {pushdown1(pos);if (ql <= L and qr >= R) {V = (V + (R - L + 1) * val) % mod;Add = (Add + val) % mod;return;}ll mid = (L + R) >> 1;if (ql <= mid)add(lson, ql, qr, val);if (qr > mid)add(rson, ql, qr, val);pushup(pos);return;
}

注意看我写的乘法和加法操作。

pushdown放在了if判断的前面。

可以证明当我们还没进入if 的时候,我们就已经执行了pushdown。

然后进入if之后,此时pos的所有标记已经被初始化了。

而,进入if后,每次执行乘法或加法的时候,只会更新乘法标记或加法标记。

所以,理论上是每一个pos最多只有一种标记的。

所以这道题就能解释的清楚了。

然后我们捋一下思路:

知道这道题中,每个pos只存在一种lazy-tag。

然后将这题分成两种情况:

先加后乘,先乘后加。

发现先加后乘可以整理为先乘后加的形式。

只用一个pushdown就可以写完这道题。


但这种方法不是万能 的,因为条件很苛刻,要求两种tag pushdown 的形式一样。

看下面这道题:

P1253 扶苏的问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1253

明显地,这是一道区间修改+区间加的题目。

比上面那一道题简单一点。

其实,我们还是可以分成两种情况。

先修改后加。

先加后修改。

对于第一种情况:先修改后加。

区间最大值维护:maxn =maxn + add

第二种情况:先加后修改。

区间和维护:maxn = rev

很明显,这无法合并。因为二者形式并不同。

所以,并不适用于所有的题目,还需要自己进行分析,这只是一种理解的小技巧

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/323773.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虾皮之家(Shopee)的数据分析插件:优化销售策略的利器

在如今竞争激烈的电商市场中&#xff0c;卖家们需要不断优化自己的销售策略&#xff0c;以吸引更多的用户并提升销售业绩。虾皮之家&#xff08;Shopee&#xff09;作为一家知名的电商平台&#xff0c;为卖家提供了一系列的数据分析插件&#xff0c;帮助卖家更深入地分析店铺数…

Java项目:111SpringBoot在线论坛

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 在线论坛是由SpringBootMybatis开发的&#xff0c;论坛提供用户注册&#xff0c;整体分为管理员和普通用户两种角色。管理员端可以生产邀请码&#xff0c;…

IntelliJ IDEA远程查看修改Ubuntu上AOSP源码

IntelliJ IDEA远程查看修改Ubuntu上的源码 本人操作环境windows10,软件版本IntelliJ IDEA 2023.2.3&#xff0c;虚拟机Ubuntu 22.04.3 LTS 1、Ubuntu系统安装openssh 查看是否安装&#xff1a; ssh -V 如果未安装&#xff1a; sudo apt install openssh-server # 开机自启…

太牛了!微信批量自动加好友你还不知道吗?

你还在一个一个地输入号码或微信号&#xff0c;再手动进行搜索添加好友吗&#xff1f;这样不仅费时费力&#xff0c;还可能会出现错误或是漏加的情况。 今天给大家分享一个支持多个微信号自动批量添加好友的宝藏工具&#xff0c;解放你的双手&#xff0c;帮你节省大量的时间和…

静态网页设计——宠物狗狗网(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; https://www.bilibili.com/video/BV1nk4y1X74M/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术&#xff1a;HTMLCSSJS&#xff08;…

微信小程序使用mqtt开发可以,真机不行

以下可以解决我的问题&#xff0c;请一步一步跟着做&#xff0c;有可能版本不一样就失败了 一、下载mqtt.js 前往蓝奏云 https://wwue.lanzouo.com/iQPdc1k50hpe 下载好后将.txt改为.js 然后放入项目里 二、连接mqtt const mqtt require(../../utils/mqtt.min); let cli…

后端开发——JDBC的学习(三)

本篇继续对JDBC进行总结&#xff1a; ①通过Service层与Dao层实现转账的练习&#xff1b; ②重点&#xff1a;由于每次使用连接就手动创建连接&#xff0c;用完后就销毁&#xff0c;这样会导致资源浪费&#xff0c;因此引入连接池&#xff0c;练习连接池的使用&#xff1b; …

又一券商被点名,网络安全问题不容忽视

12月25日&#xff0c;黑龙江证监局发布公告表示&#xff0c;江海证券存在关于IT治理、网络安全管理的内部决策、执行机制不健全&#xff1b;公司App个人信息保护合规性检测不充分&#xff0c;App强制、频繁、过度索取权限等问题。因此&#xff0c;黑龙江证监局决定对江海证券采…

理解二叉树的遍历(算法村第七关白银挑战)

二叉树的前序遍历 144. 二叉树的前序遍历 - 力扣&#xff08;LeetCode&#xff09; 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]解 LeetCode以及面试中提供的方法可能…

windows安装kafka以及kafka管理工具推荐

windows安装 1.下载地址 下载地址 下载最新版本的.tgz文件解压 2.修改配置 修改config目录下的zookeeper.properties中的dataDir属性 server.properties文件中的log.dir属性 3.启动zookeeper 进入到bin\windows\下的用cmd输入zookeeper-server-start.bat ..\..\config\zo…

java发送邮件到qq邮箱

自己的授权码自己记好 引入依赖 <dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.6.2</version> </dependency> <dependency><groupId>javax.mail</groupId>&…

计算机视觉与美颜SDK:详解人脸美型功能的实现过程

众所周知。人脸美型功能作为美颜技术的一项关键特性&#xff0c;对于用户塑造理想形象具有重要意义。本文将深入探讨计算机视觉与美颜SDK中人脸美型功能的实现过程。 一、关键点定位 关键点定位是人脸美型的关键步骤之一。深度学习方法在关键点定位方面取得了巨大的成功&…