3.9 听课记录
远程蹭了个课,lxl 讲的青蛙很不错。
先都口胡一下,回头再补代码,没时间写。
倍增值域分块
倍增值域分块的思想,就是将值域分块为
CF1515I Phoenix and Diamonds
有
种二元组 和一个由这些二元组序列组成的序列,按照 为第一关键字从大到小, 为第二关键字从小到大排序,初始时有第 种二元组 个。 接下来你要进行
次操作,操作有三种:
- 加入
个 二元组。 - 删除
个 二元组。 - 给定一个
,从左往右依次枚举二元组,若 ,则令 ,求最后的 等于多少。
我们将值域按照
考虑我们枚举到的所有可能的
第三种情况肯定是不会被统计到的,考虑前两种情况。
如果出现了
那么我们可以对每一块开一颗线段树来维护这个东西。对于前者,我们在线段树上维护所有
这样我们只需要比较两种情况哪个先掉下
修改也是容易的,发现上述两棵线段树的值都是容易维护的,直接维护即可。
LOJ3527 「IOI2021」地牢游戏
发现这题和上一题非常类似,同样可以用类似的方式进行分块。
对于 恰烂分,同样对于
但是这道题是类似于一个图的东西,并不好维护。我们类似于上一题的做法,考虑全部都是
P4587 [FJOI2016]神秘数
一个可重复数字集合
的神秘数定义为最小的不能被 的子集的和表示的正整数。例如 ,有: , , , , , , 。
无法表示为集合 的子集的和,故集合 的神秘数为 。 现给定长度为
的正整数序列 , 次询问,每次询问包含两个参数 ,你需要求出由 所组成的可重集合的神秘数。 对于
的数据点, , 。
题目实际上是求所有子集和的
我们维护一个所有数都能被表示出来的前缀,然后每次考虑这个前缀中新增加的数。如果
我们发现,由于
如果带修呢?
2019 ICPC 徐州 H Yuuki and a problem
同上述问题,需要支持单点修改。
如果直接套上述做法需要一个树状数组套可持久化线段树,复杂度
上述问题的瓶颈其实在于我们需要支持一个动态的二位数点,其中两维都是动态的。
我们能不能通过对值域分块使得一种一维变成静态的?
考虑利用
这样我们可以发现,这个 trick 的实质是将
P7447 [Ynoi2007] rgxsxrs
给定一个长为
的序列 ,需要实现 次操作:
1 l r x
:表示将区间中所有 的元素减去 。
2 l r
:表示询问区间的和,最小值,最大值。 对于
的数据, , 。 强制在线,空间限制 64 MB。
考虑到每个数只增不减,所以可以类似于势能的方法去维护。但是值域太大,仍然无法接受。
我们考虑对值域分块,对整个值域中的数进行维护。那么考虑
减半警报器
一类神奇的问题,可以以
Codeforces GYM 102452 I
有
个地点,每个地点可能会发生若干次事件,事件有一个权值。 有若干次监测活动,每次会在
个地点 ( )放置监视器,若监视器监视到的地点发生的事件的权值和大于等于 ,则发生警报。 有
次操作:
:启动一次监视活动。 :在 地点发生了一次权值为 的事件。 在每次
操作后,输出发生警报的监视活动的编号,忽略之前已经发生过的警报。
。
假如
对于
考虑将互相限制拆开。我们可以先将每个监视活动的
P7603 [THUPC2021] 鬼街
lxl 瑞平 THUPC。
实际上发现这个题和上一个题一模一样,由某个众所周知的表,可以发现质因子个数最多为
Codeforces GYM 104065 B
你可以邀请
个人来参加会议,第 个人会参加会议当且仅当在 中至少有 个人参加会议,问最多有多少人参加会议。
首先容易发现肯定是每次邀请能邀请的,类似于一个拓扑排序的过程。直接模拟这个过程即可。
那么我们实际上每次要找的就是已经满足了条件的人。
看起来和上一题是类似的,但是这次每个人的地点并不是常数个,直接套肯定不行。
考虑将一段区间分成两段。我们先假设所有区间都经过某一点
不在同一个区间呢?直接考虑分治,所有区间要不然经过中点,要不然完全在左边,要不然完全在右边。
那么这个分治过程其实就是棵线段树,直接类似于线段树单点修改即可。
每个前缀只出现一次,所以每个节点被修改的复杂度仍然是
Codeforces GYM 102331 F
给你
个点,点 有点权 ,有 个三元组 ,不断进行以下操作:
- 找出最小的一个
,满足 不连通,且 所在的连通块的点权和 ; - 若存在
,则联通 ;否则,停止操作。 你需要输出最后一共联通了多少,以及联通的顺序。
完全类似的,我们考虑维护出每个连通块的所有出边(三元组),那么每次合并两个连通块就是让这些出边的权值减去另一个连通块的权值和。同样将权值平分到两个连通块上,拿平衡树或者线段树维护,合并即可。
支配对
很多题我们需要统计区间内每一对数的贡献,而对数是
lxl 将这类问题分为了两类,这里也分一下吧。
第一类支配对
贡献对数为
常见于树上,两两求
P7880 [Ynoi2006] rldcot
给定一颗树,每次询问一个区间
,求对于所有的 ,本质不同的 有多少。
先不管深度,先考虑
考虑启发式合并,每插入一个点
可是此时还是会出现算重的情况。但是注意到最后要查询的实际上是一个矩形查询,而每个点能造成影响的点为一个矩形,为了避免算重,我们可以用扫描线求矩形并,这样就能处理出本质不同的数量了。
对于深度来说,我们把深度相同的点一块做类似于矩形并的东西即可。实际上由于矩阵的形式直接维护最大高度即可。
P8528 [Ynoi2003] 铃原露露
给定一棵树,每次询问一个区间
,求有多少 满足对于任意 ,都有 。
全部都满足很抽象,我们可以改成求存在一个不满足,这样求矩阵并就是所有不满足的情况。
什么情况下不满足呢?还是考虑对于每一个点作为
同样考虑支配关系,假如有某个
那么接下来就是一个区间并的问题了,线段树维护最小值和最小值的个数之类的东西就能求出来了。
第二类支配对
贡献对数为
常见于序列上求区间内所有点对的贡献的
这种问题一半考虑对于某一个左端点,有
CF765F Souvenirs
给定一个序列
,每次询问一个区间 ,求 的最小值。
老经典题了。
考虑对于某个
那么我们就只需要对这
CodeChef MINXORSEG
给定一个序列
,每次询问一个区间 ,求 的最小值。
类似的套路,对于某个
首先开头不可能都相等,那么假如
若
所以,只有
P9058 [Ynoi2004] rpmtdq
给你一棵
个点的树,边权为正数。定义 为树上 的最短路径长。 有
次询问,每次给定 ,对于所有的 ,求 。
这种存在两维信息的问题一般选取较复杂的一维进行分治。
考虑对树进行边分治。对于一条边,考虑经过这条边的所有路径。
首先,我们有一个朴素的想法:求出每个点到边的距离,对于每一个点,选取另一边的距离前驱和后继。但是,这样只能保证距离最小,但是不能保证它为支配对,当区间缩小时可能会有距离更大但是没有统计的点对。
考虑对距离进行限制,再求编号的前驱与后继。假如树的左边有一个点
这意味着,只有前驱后继是有用的了。而我们发现,对距离进行这样的限制是可以考虑到所有点对的,因为每对点中必定有一个距离更远,距离更远的那个点就可以统计到这个点对。
所以每次所有点都只有
最后同样再上扫描线就做完了。
杂题
没听,吃饭去了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?