2 月做题记录

0205T1 正方形
这道题赛时想了一个常数极大的
思路是这样的:我们最暴力的方法就是容易想的,枚举矩形起点两个
容易发现,假如你以某一个点为正方形右下角顶点,边长为
但是我们如何统计颜色?这道题有一个特殊的性质:
切比雪夫距离:点
上文说到,统计切比雪夫距离最小的
而转移也是非常好想的:
这道题就做完了。
代码(合并的时候要使用快速一点的算法):here
0205T2 牛
我的代码即题解:2K多注释+画图,长度1K变3.7K,非常牛逼
代码里没写的地方:主函数功能为二分答案 t,求得最小所花费时间。
本来是波兰语题解,QOJ 博客上有人给翻译为了中文。
Bing 搜索结果:
没有与此相关的结果: QOJ9961
- 检查拼写或尝试其他关键字
顺带一提,T3 的名字就叫 Bing
。但我不会做,看题解吧。
Tfs:——“你觉得你会 DP 吗?”
490DX:——“显然吧,DP 什么的不是很基础吗?”
在 2 月 4 日 490DX T1 爆零之前,Tfs 和 490DX 的对话。
P10614 Hero meet devil IN Lv.13
这道题我们首先考虑如何求两个串的最长 LCS。
显然,可用 DP 求得,设
但是现在只是知道了当
那么我们可以再套一层 DP。设
根据前面推的那个式子,可以求出之前 LCS 数组状态为
那么就可以枚举
但是正常情况下的数组
最后的就是求每一个状态 popcount
,这个值其实就是这个状态对应的 LCS 的长度。然后统计答案即可。
Double Exp:ABC391G Many LCS IN Lv.12
P4590 游园会 IN Lv.13
这道题和上一道题唯一的不同之处就是:这里不能以 NOI
作为子串。
那么我们就给
然后加的时候就分类讨论:
1 | int o = i&1; |
还有这道题要优化空间,就像这份代码一样用滚动数组!否则你会 Memory Limit Enough
!(bushi
0206T3 征服
猜猜我为什么要写前两道 DP 套 DP,还不是因为要补题……
这道题思路和前两道题相似:首先,内层 DP,设
因为说
我们设
最后统计答案,这道题就做完了。
P6007 Springboards G IN Lv.14
一道树状数组优化 DP 简单题,我不知道它是怎么被评到 IN Lv.14 的。但是我也是脑梗,做了 2 个小时才收。
首先我们可以想到朴素 DP:设
又因为有跳板,那么当点
但是因为
而再看转移式:
(为描述方便,我们记
于是我们可以维护在
最后答案就是
0207T1 交换
原题:CF1329G Omkar and Pies IN Lv.13
这道题的
首先看到连续一段区间操作,现在想知道对于每个
假如说我们已经求出来了依次执行操作
实际上因为操作是连续的,要从操作
现在后缀已经求出来了。考虑如何从后缀变为区间。因为不可能从
这样,计算所有区间变化后的结果,即
然后开始计算答案。因为最后的答案一定是某个
而因为我们原来是知道
这种方法虽然不保证做得到不重,但是一定能做得到不漏。
然而,直接对于
表示可以包含 的 的最小 。 表示可以包含 的 的最大 。
这两个数组相当于就是枚举了包含状态
那么就首先设置
最后枚举每一个
0207T2 游戏
OJ7 卡死了,原题都过了 OJ7 上面交不了,神秘。
Github 上面的 11490dx.net 都上的去,OJ7 还卡死了,神秘。
首先我们可以先求
每一行有两个数
根据题目限制,每一个点的入度和出度的差值要
然后根据上面的建边原则交换一些
那么当
注意因为这道题的求欧拉路的过程比较多,因此需要用当前弧优化:
1 | inline void GetEuler(int x){ |
0208T1 Add
原题:P3544 BEZ-Minimalist Security IN Lv.14
离 T1 满分最近的一次。但是因为【数据删除】子任务捆绑和不等式情况漏讨论导致 T1 爆零。可惜了。
这道题很明显地,可以一个一个连通块的来讨论。而在一个连通块内,只要你定了一个点的值,其它点的值也会因此而确定。所以我们可以定连通块里的起始点
假设一个点知道了它的
而如果我们不知道的话,那么就再 DFS 一遍,因为每一个点有其对应的减少量范围 Wrong Answer
了。
然后你就会得到一个最小值和最大值。若最小值大于最大值,那么就输出 NIE
。否则定一个全局答案的最小值和最大值,然后把答案加进去。最后输出即可。
0208T2 Badminton
联考题没看就直接讲原题吧。
首先,先不考虑边界问题。那么对于每一个核电站,它的泄漏范围一定是一个以其为中心点的正方形。我们可以把这个泄漏范围画出来,然后会发现一些性质:
于是我们修改矩阵的时间复杂度就从
我们发现这个差分矩阵也非常特殊,斜方向的值都是相同的。于是我们可以再给这个差分矩阵做一次差分。而这个新差分矩阵就不是二维差分,而是很多个斜方向一维差分数组。类似这种(矩阵里的相同编号的表示一个一维差分数组):
同理,还有另一个差分数组,对应 \
方向。
现在要考虑边界问题了。我们就可以分类讨论。这里的分类讨论的过程太过繁杂,所以写了一个下午。简而言之,就是讨论每一种 /
和 \
的端点和整个大矩形(
而为了好
然后分类讨论,每一个 \
的上端点有 /
的上端点有
而最后,根据差分数组还原到原数组之后,因为要求矩形之和,所以再给原数组求一遍前缀和,然后查询前缀和查询即可。而这道题要求求平均值,所以还要除以面积。但是不能直接的使用 double
处理,因为你这样处理会有浮点误差,四舍五入不会得到正确的结果。这里有一种方法,把余数
(图为 490DX 因最终发现浮点误差问题而红温,在黑板上写下的几个大字)
0210T1 石头
原题:P6645 Interval Collection IN Lv.13
这道题头一次联考的题面比原题的题面写得好。
并且致敬传奇联考从 statement.pdf
到 statement-new-v1.pdf
一直改到 statement-new-v6.pdf
。
这次对着联考的形式化题面讲。
首先,很容易想到最后的答案一定是只进行
然后我们就分类讨论:设现在的包含所有区间的集合为 multiset
)。
- 若
里面包含的所有区间存在交,设其为 ,那么就要选右端点为 并且左端点最大的区间,和左端点为 并且右端点最小的区间。要实现的话就对每一个点存以其为右端点的左端点的 multiset
,反方向同理。 - 若
里面包含的所有区间不存在交,那么就要选两个不交区间 和 并且 最小。那么我们就可以用线段树实现。每一个节点 存储左端点在 之间的最小右端点 、右端点在 之间的最大左端点 、和 和 均在 之间的最小 ,设其为 。于是可以推出来:
然后最后 query
一下根节点的
求交就记录所有的左端点和右端点,然后求左端点的最大值和右端点的最小值即可。
为什么洛谷改 UI 了!!!我的 phigros-in-luogu 插件除了在题目检索界面和提交记录界面之外的其他地方都用不了了!!!原本的 Phi 标现在就变成了一个冰冷的 AC 或者是 100 了 /ll,而且也不是一百万分制了 /ll,题目界面配上 Dark Reader 其实也没有好看到哪里去。并且里面的【IN Lv.13】就直接变回原来的了,而且题目颜色也显示不了了啊!!!
0211T1 乌龟
原题:Gym103495 B
这道题最特殊的点就在于
可以首先把这两个龟给拆开,每一个龟跑自己的,因为
那么每一个龟应该跑什么呢?因为要关于每一个龟杀的猪的集合,我们可以设
求得这个有一个方法,就是枚举 ((stat >> (p-1)) & 1) == 0
),而且你还必须要在这只猪出现或出现之前赶到现场把它宰了,不然它会跑(即 dis[stat][x] <= t
),则可以转移: dp[stat^(1<<(p-1))] = min(dp[stat^(1<<(p-1))], t)
。
最后就像上面所说,跑了两遍 Dijkstra 之后,枚举第一只龟杀的猪的集合,然后推出第二只龟杀的猪的集合,然后取最大值作为当前答案。最后就是在这些答案中取最小值即可。
0211T2 路灯
而这道题就考了我们数学。顺带一提,看到题目里面的 double
求值后和
去网上搜索了一下这种三角形的种类,它叫做本原直角三角形。它有一个定理,就是说这种三角形的三边
而知道定理也要知晓如何证明:
现在你要求
并且 的通解,那么首先可以把原式转化为 。 那么首先,定理 1:
。分类讨论:
若
为偶数,那么 有 这一质因子, 也就包含因子 。 而若
为奇数,那么 就可以被描述为 ,然后 了。 根据这个定理,我们可以推出:
为一奇一偶的。因为若全为偶数,那么就不满足 ,而若全是奇数,那么 ,而这在定理 1 中是不存在的,所以也舍去,即得证。 那么这里先钦定
为奇数, 为偶数。而又因为 ,那么 。 然后定理 2:
和 均为完全平方数。 发现这里有
项和 项,那么我们设 ,则 。而因为 ,所以 。可以发现这玩意可以被看成两个数的和与差的 为 ,则 。 然后我们就可以把原式变为含
项: 。而因为我们钦定 为偶数,那么可以变为 。而根据上一自然段得出的互质结论,并且乘起来的结果为平方数,所以只能是 和 均为完全平方数了。即得证。 因为
和 均为完全平方数,所以我们设 ,则 ,又因为 为正整数,所以 ,然后解关于 的方程可得 , 。本原直角三角形通解公式得证。
我们发现,这个公式,可以变式为
则这道题让我们求的
那么我们就可以先求出
我们可以先预处理
于是
于是可以先预处理所有的 Mobius 函数和所有数的因数集合(因为数字大小
然后如何一个一个算出
我们可以记录差分数组
具体地,枚举
最后根据差分数组还原原数组,然后用 double
计算题目里的
后记:啊啊啊啊啊啊比赛也没打全去证明这道题的定理去了,已经 23:50 了我要困死了……ヽ(*。>Д<)o゜
0213T1 Super
这道题可以把原集合转化为图,因为无序,
如何构造有解?可以从小到大枚举其中一个端点
我们提取出其中两条边
但是如果这样的接驳点
然后最后输出就是先从前到后输出修改
时间复杂度 _Find_first()
函数找到第一个
后记:一些神奇的事情:我在开放注册通道的间隙注册了一个小号,但是被隔壁机房发现了,于是痛失小号╥﹏╥…
0214T1 玩游戏
这道题因为
因为从其它地方转移到点
为了求得完成状态
最后,求出所有的
1 | for(int stat=(1<<n)-1;stat>=1;stat--){ |
0214T2 送外卖
这道题一眼是网络流。但是只能想到方法是网络流,具体怎么做不会……
首先,我们不管强制不让外卖员送餐的限制。直接网络流求整体最大值
也就是把所有的餐馆
然后现在限制加进来了,就分类讨论:
- 假设边
没有流量流过,那么删掉这条边没有影响,答案就是 。 - 否则,边
有流量流过,那么我们就要让它退流,然后重新找一条从 到 的最长路径。设 ,这就相当于是求在残量网络 上,点 到点 的最长路。因为我们存的是负边,那么就是求最短路。负边加最短路很明显用 SPFA 求。求出最短路长度、取反后设其为 ,那么答案就是 。注意这里边的长度是原图的边长,而不是残量网络上的。
于是这道题就做完了。喜提第二劣解。
CF1817D Toy Machine IN Lv.15
为了方便讲述,请用
,即它是中间那个,那么执行一个 DL
操作即可。,即它在左边,那么也简单,先做 L
操作,然后重复做DLUL
操作,直到在最左上格为止。 ,这个比较复杂。 - 首先,先
L
一下,然后一直执行DLUL
直到在中间的 #
之上。 - 然后,执行
R
操作,将上面的东西移到右边。这时我们要用左边的东西把右边塞满,就一直执行DRUR
操作直到右边被填满为止。 - 最后,整个序列就被分成了上面的以
为右端点的序列和下面的序列。我们要把这个 提取出来并放到最左边。那么首先执行 LD
操作把上面序列的第一个字符提取出来。然后执行RUR
操作合并上下两个序列并把刚刚提取出来的那个字符塞到整个序列的后面,这样就在这个序列的正中间往左 格的区域了。最后执行 DL
操作把提取出来并放到最左边即可。
- 首先,先
思维题。思维比较难想,代码 710B。
CF2064E Mycraft Sand Sort
由于这道题是最新最热,故难度还未发表。
首先看样例图示。因为排列的最小值肯定是
然后赛时就被卡在这里了。喜提 Rank 1000。o(一︿一+)o
赛后询问做法才发现,“沙子排序”的实质其实就是第
而因为
那么,转机来了:假设第 2355541
,现在原本数组删掉第 4 个 5
变成 235541
,那么还有其他方法可以删除吗?肯定有的。找到这个 5
所在的颜色相同的最长连续段 555
(舞舞舞(bushi),可以发现这 3 个 5
中其实删除任意一个 5
都可以达成目标相对顺序。所以这一步有
然后将它一般化,其实我们可以找到即将删除的元素在相对顺序中的位置,然后找到经过这个位置的颜色相同的最长连续段。因为每一步做法对下一步都是有影响的,所以答案就乘上最长连续段长度即可。
手玩一玩样例也可以知道。这里提供一组样例及做法:
IN:5 || 4 3 2 1 5 || 2 2 1 1 2
,OUT:12
然后就可以开做了。本人的做法是开一条链,因为要删除元素,每一个节点存储它的前一个节点和后一个节点分别是什么。然后再开一个并查集,维护每一个连续段和其长度。要删除元素的时候就在链上删除这个元素,和(如果这个点在链上的前一个点和后一个点颜色相同)在并查集中合并左右端点及长度。
P4198 楼房重建 IN Lv.15
线段树单侧递归板题 + 难调题!!!!
【数据删除】【数据删除】【数据删除】【数据删除】【数据删除】【数据删除】【数据删除】【数据删除】【数据删除】【数据删除】
这道题楼房能被看见的实质其实就是:计算每一个楼房的斜率
那么,我们可以用线段树来维护区间:线段树上的每一个节点记前缀最大值序列长度
我们分情况讨论:现在一个区间分左区间
若
,那么 和 均取 的。 而若
,我们就求右区间的大于 的前缀最大值个数。而为了求值方便,我们反过来,求右区间的小于等于 的前缀最大值个数,我们定义区间 的小于等于 的前缀最大值个数为 (那么现在要求的就是 ): - 若
,直接求即可。否则可以将其分为 两个区间。 - 若
,返回 即可。因为后面的都大于 ,这不是我们要求的东西。不管。 - 否则,即
,那么就到后面去找。但是这里有一个小插曲:因为后面的前缀最大值是从 开始计算的,而不是从 开始算的。所以我们要在计算时把后面前缀最大值个数减去 ,令其为 。括号里的代表的就是右边大于 的个数。减去就是右边的小于等于 的前缀最大值的个数了。那么答案就是 。
求出来
值之后拿 的 减去它,最后加上 即可。 - 若
这就是 pushup
函数和 les
函数的工作原理。所以这种线段树单侧递归主要就是合并区间的 pushup
要下点功夫了。最后查询线段树根节点的
注意:这道题的斜率是个 double
型,所以有浮点误差(可以点击这里看本人之前因此而破防)。而这里又不能用长整型来替代,所以只能设置 eps = 1e-11
(不知道其它指数可不可以)来减小这个误差。
P9130 Hungry Cow P IN Lv.15
这道题依然可以使用线段树维护。而因为
线段树上的一个节点
我们开始 pushup(x)
:
是好维护的,就是右儿子的 加上左儿子填完右儿子的没有吃草的天数后剩下的干草数量。因为右儿子的长度和吃草的天数已知,所以没有吃草的天数就是它们之差。 也是好维护的。就是左儿子的 加上右儿子的 加上剩下的没有吃草的天数能被左儿子的 填满几个。 就要下一点功夫了。首先左儿子的 肯定是要算进去的吧,现在来对右儿子单侧递归,就是算右儿子被左儿子的 尽量填满之后右儿子的 : - 如果这个区间的长度为
,那么若 还有值,那就返回这个区间的端点(因为你要尽量填上,然后返回天数),否则返回原本的 。 - 否则算左儿子还有多少个空的。记其为
。如果 ,也就是左边可以被填满,那么就返回左区间包含的天数之和(可用等差数列求得)加上右区间填满 的答案。 - 否则你就要去填左区间。那答案就是左区间填满
的答案加上右区间在考虑左区间 的答案。也就是我们现在正在算的东西。所以我们对于每一个线段树节点再维护一个变量 ,表示这个区间考虑左区间的 后的答案。加上右区间的 值即可。
然后给
节点的 赋上求出来的值,最后 节点的答案就是左儿子的 加上 节点的 值。 - 如果这个区间的长度为
注意!这里的
修改操作(
- 如果
,那么叶子节点所有变量全部赋为 。 - 否则,那么你就要把这个空填上,所以叶子节点的
。然后剩下 个干草。被填的区间很明显有 1 个。
查询直接查根节点的
P5278 算术天才⑨与等差数列 IN Lv.16
对于每一个等差数列为
, , 。
这里的
发现这三个玩意都可以用线段树维护。
那么我们就可以用 set
维护同一种值(可以看作颜色)的下标集合,然后查询 set
里面查这个
后记:因为我脑子宕机了,写了一个 6KB 的代码(正常代码 2~3 KB)。调了一堆时间才过。跑得倒是挺快的。
Double Exp:P3792 由乃大母型原神 IN Lv.14
AT_jsc2019_final_h Distinct Integers IN Lv.15
注意:这里的下标均从
先看查询。我们记
所以当我们要查找以
那么我们需要求
求区间的 pushup
上面下一点功夫了。
我们现在知道区间
- 若该区间为叶子节点,那么直接返回左区间的
和叶子节点答案的最大值。 - 否则,将该区间分为左右子区间,若左区间的
值小于 区间的 ,那在考虑 之后,左区间肯定会全部都是 区间的 。递归右区间即可。 - 否则,递归左区间找答案。再把答案加上该区间的
减去该区间的右子区间的 。因为此时左子区间的 的限制已经强于 的限制条件了。
查询的时候记得每一个 pushup
里面的线段树单侧递归函数的极限参数设为
P4592 异或 IN Lv.15
(・∀・(・∀・(・∀・*)
这道题使用可持久化 Trie。
首先我们考虑如果只维护一维数组
那么就可以使用
1 | int trie[N*32][2], val[N*32]; |
然后查询就直接在
1 | int query(int pre, int x, int w){ |
那么现在看题:
若查询点
的子树,就建一棵 dfn 序的 Trie 树。 insert
操作的就传该点的 。查询就直接记录从这个点进子树的 dfn 和出子树的 dfn 查就可以了。 若查询路径
,那么就建一棵基于父亲的 Trie 树。 insert
操作的就传该点的父亲即可。查询就找 LCA,然后两条链上分别查即可。
P5795 异或运算 IN Lv.15
首先建出关于
查询的时候就这样:
- 因为
很小,所以可以枚举所有 的值和它们所在的节点(即上文代码的 pre
和x
)。 - 然后枚举位。对于位
,看有多少个该位答案是 的数 和答案是 的数 (利用 val
查找)。如果答案是的数大于等于 ,那么就选 。 - 否则就选
,并将 。但不管是选 还是 ,都要更新所有 的 pre
和x
,为了下一次统计和 。 - 最后输出选的答案即可。
AT_abc258_g Triangle IN Lv.13
?
用 bitset 艹过去即可。
P7446 rfplca AT Lv.16
喜提一道 AT Lv.16 和 *3400(Double Exp),爽。
这道题是一道由乃 OI。首先就想到分块。
我们分块,每一个节点存储两个信息:
- 这个点当前的父亲
。 - 从这个点一直跳父亲直到跳出这个块所在的节点
。
修改时,散块重构,复杂度明显
目前的修改整块还是需要一个一个修改的,单次复杂度
查询的话,就分情况讨论:
- 若
所在的块 所在的块,取 更大的变量,然后跳祖先到 。 - 否则,若
,取 更大的变量,然后跳祖先到 。 - 否则,若
,取 和 里面更大的,然后跳父亲。
直到
ABC394E Palindromic Shortest Path
我恨回文和图论。结果这两玩意还给我放一起考了。很明显没做出来,喜提 Rank 2600+。
这道题利用了回文字符串的一个性质:原本的一个回文串,两边加上同一个字母,这个新的字符串也是回文串。
于是乎,我们可以开始:用一个队列维护现在已知的所有回文串。然后用一个
那么就可以:首先将所有长度为 push
进一个队列里,然后再把所有长度为 -
的所有位置 push
进去。这样可以维护所有回文串的长度单调性。记得更新
然后开始查询:首先提取出来队头 pop
,我们要找到一个 push
进队即可。
时间复杂度
ABC394F Alkane
不明显,这个树的形态只有两种(确实不明显,但题解区里说手画一下即可得,可能是【数据删除】的 E 题把我给整蒙了):
- 根的度数为
,非叶子节点度数为 。 - 根的度数为
,非叶子节点度数为 。
于是,可以开始树形 DP:
设
于是开始转移:遍历所有儿子
又注意到题目中有一个“至少有一个顶点度数为
0224T1 和平外交
似乎确实是信心赛。因为这是我第一次真正意义上的场切 T1。不过 T1 在洛谷上面的难度是紫。
3 次 DFS 加上求链的和即可过。
0224T2 Maimai PRiSM
原题:CF1740G
这道题有一个性质:就是它构造出的解的剩余的光棱塔的数量永远都是
因为是 chekck-max 操作,所以就从
根据这个贡献就可以算出这个光棱塔应该填
然后对于
P7610 群星连结
大模拟。12 KB。
- Title: 2 月做题记录
- Author: 11490DX
- Created at : 2025-02-05 20:32:21
- Updated at : 2025-03-24 16:57:24
- Link: https://11490dx.net/2025/02/05/R702-practice-log/
- License: This work is licensed under CC BY-NC-SA 4.0.