日志

10 月 11 日总结

2025/10/11 模拟赛总结

8 月 29 日总结

完全匹配等价于在 AC 自动机上跑匹配通过任意一条路径走到了模式串的最终节点上

P2444 [POI 2000] 病毒

而这题要求没有任何匹配上的字符串,在 AC 自动机等价于找一个环,使得从树根到环的路径上和环内都没有任何字符串的最终节点。

P2414 [NOI2011] 阿狸的打字机

先对所有字符串建 AC 自动机。显然查询的两个字符串都在 AC 自动机上。考虑查询 y 在 x 中出现了多少次。按照一般的 AC 自动机匹配过程,会先把 x 字符串全部打满标记,然后根据 fail 将标记传递,最终 y 的结束节点上有多少标记就是 y 出现了多少次。那么可以将题目转化为:x 字符串上有多少个位置可以通过 fail 走到 y 的最后一个位置上。由于这个问题只和 AC 自动机上的结点和 fail 有关,那么把它们单独拉出来,建出 fail 树。那么能走到节点 u 的节点都在 u 的子树内。显然是要直接拍成序列来做的,这样子树就对应了一段连续的区间。x 对应的不是一段连续的区间,那就考虑把 x 上的点一个个加入(就是遍历一遍 trie),最后查询和 x 有关的询问即可。

思路过程:建出 AC 自动机->观察一组查询暴力匹配的过程->转化题意变成树上问题

总结:没有直接做的思路时先观察暴力,然后利用其中与普通匹配不一样的地方(例如这题就是查询的两个字符串都在 AC 自动机上)从而做出来

8 月 28 日总结

把 01 trie 题单里的题做完了,其实都是纯模板题。复习了 AC 自动机,感觉 AC 自动机就是把 KMP 拓展到了多个字符串身上

P4052 [JSOI2007] 文本生成器

题意:给定若干模式串,计算有多少长度为 m 的文本串包含至少一个模式串

显然直接做不好去重,可以直接容斥,算出不包含任何一个模式串的文本串的数量。设状态为 \(f_{i, s}\) 表示现在在第 \(i\) 个点,长度为 \(s\) 的文本串的数量,在 AC 自动机上跑 dp 就行了

8 月 27 日总结

不知道要做什么题,打了几场 CF,有好多 ad-hoc 题做不出来。这种题目就是找到一个比较强的性质然后尽可能的利用这些性质。

C1. Interactive RBS (Easy Version)

题意:有一个长度为 \(n \le 1000\) 的隐藏的括号序列。可以给出若干询问,每次询问给出 \(k \le 1000\) 个下标(可重),按询问的顺序把这 k 个位置拼成一个括号序列,返回括号序列中合法括号串的子串数量。需要在不多于 550/200/100 个查询中找出隐藏的括号序列

显然要能够利用上询问的信息,必然需要一组 (),参与以后的查询。考虑二分查找到一组 ()。二分最小的 p 满足 [1, p]的括号序列中返回的值为 1,显然 p 为 ) 且 p - 1 为 (。

考虑观察一个未知位置是左括号还是右括号的区别。(???) 这种括号序列是我们不想要的,因为不知道是哪里成功匹配了。考虑询问若干个形如 ?)()()() 的括号序列。假设后面有 k 个已匹配括号,那么 ? 是左括号和右括号的答案刚好差了 k + 1,这样就可以查询出一个位置。显然要尽可能利用每次询问的信息,那么就是把每次询问能给出的下标尽可能填满。要让每一组这样的序列不互相冲突,很容易想到构造 k + 1 为二进制的每一个位置。要剔除掉相邻两组括号序列的干扰,需要把相邻的两组括号序列用 ) 隔开。这样就完成了在 200 次讯问中找到答案的条件

基本思路就是每次查询若干组互不干扰的含问号括号序列,要使得查询次数尽可能少,就需要优化找到一个问号需要的匹配括号数。发现我们的括号序列每次差的答案为 k,没有充分利用到一个括号序列可以有 $\dfrac{k * (k - 1)}{2} 个子序列的性质。把问号放到开头不如把问号放到中间,这样把两个括号序列拼在一起增加的答案是 (l + 1)(r + 1),这样每一组括号序列需要的匹配括号数就从 \(2^k\) 变成了 \(2^{\dfrac{k}{2}}\)

总结:对于一种构造,先找到最符合直觉的构造,再对这样的构造进行小调整,使得它能充分利用信息。

8 月 26 日总结

Codeforces Round 1044 (Div. 2)

C

找到最长路径上的点是好找的,关键在于如何对它们排序。可以用上第一次查询的信息,就知道了每个点在路径中的位置

D

因为总伤害不变,所以掉落伤害最大化就是直接打怪的伤害最小化。打怪的顺序一定是从后往前决定从第一个堆分下来的堆顶,这样可以使掉落伤害最大化。根据这个拓扑序直接写出转移方程,再优化。

总结:求一个最优化属性的时候可以用容斥求另一个最优化属性

E

显然每个点至少要查询一次,那就只需要分配剩下 \(\dfrac{n}{4}\) 的断开点操作用在哪些点身上。注意到一条链只用查询操作就可以抓到人,那么只需要断开度数大于等于 3 的点即可。但是这样子给一颗二叉树就炸掉了。发现对于这样一个度数为 3 的点,断掉两个儿子的父亲是更加优的做法,可以尽量的形成多的链。最后只需要把所有链找出来按顺序输出。

F

线段树优化 dp 模板

8 月 25 日总结

P3975 [TJOI2015] 弦论

卡在了求前缀 min 的和。但是当时没有意识到这个问题本质上就是求前缀 min 的和。没想明白这是怎么卡住我的。可能时做的题太少了吧

P4094 [HEOI2016/TJOI2016] 字符串

卡在了不会用主席树/kk,感觉还是练太少了

总结:做的题太少,一些基础还不牢

8 月 24 日总结

做了几道 SA 模板题,然后口胡了 DEF,G 算判别式的时候 4 忘记乘上去了。

8 月 13 日总结

CodeForces-251D

贪心的时候如果没有拓扑序,应该按拓扑序 dp。这题应该先把 all 为 0 的状态先处理。最后得到了一个答案,方案可以用一个多元方程组表示,用高斯消元解方程得出答案

CF1100F Ivan and Burgers

前缀线性基是尽量插入晚一点的元素。这样后来的元素不可能和前面的元素发生关系(如果产生冲突,用后来的元素代替前面的元素),然后挑满足要求的元素做线性基。非常之巧妙

P2973 [USACO10HOL] Driving Out the Piggies G

有环图随机游走问题直接解方程高斯消元

CF1823F Random Walk

树上随机游走问题比较套路的做法是设 \(f_u = A_uF_fa + B_u\),解方程解出 \(A_u\)\(B_u\),递推 \(f_u\) 即可。

8 月 12 日总结

写了两道线段树题目,感觉我对线段树一无所知。线段树维护的信息不一定要可以合并,可以在加入元素的时候在对应的结点的祖先上统计对祖先的答案,这样祖先就可以表示子树内的答案了

被卡空间力。经典优化方法把范围在 0~255 内的数组数据类型设成 char

8 月 10 日模拟赛总结

模拟赛总结

8 月 9 日总结

CF1790F Timofey and Black-White Tree

显然每次最近距离最少会衰减一倍。但是每次直接枚举层数是不行的,会加入很多重复的节点,可以设计 \(dis_i\) 表示离 \(i\) 最近的黑点。考虑如何快速更新 \(dis\),由刚才的结论只用更新 \(k\) 层。但是更新子树内的答案是不必要的,因为子树内的答案可以在子树内成为黑点时再更新。兄弟节点的答案会在它们的 lca 处更新,所以做法的正确性是毫无疑问正确的。

总结:考虑树上链的答案统计可以在祖先处把两端答案拼接起来,和前一天做过的CF2033G Sakurako and Chefir方法比较类似

G. Rikka with Intersections of Paths

先满足经过同一个点:枚举每个点,组合数算出选择 \(k\) 条路径的答案。但是这样肯定会算重,希望通过一种映射把方案对应起来方便计算。发现每种方案经过的最浅的点表示这种方案,那直接容斥计算以当前节点为最浅节点即所有路径端点的 lca 的所有方案数即可

总结:lca 能够表示一种路径或选择若干中路径的方案,考虑在 lca 计算答案是比较优秀的做法

8 月 8 日总结

CF1794E Labeling the Tree with Distances

看到匹配两个集合还没反应过来,没想起就是集合哈希。之前学的全忘了属于是

G. Sakurako and Chefir

这种类似求 \(k\) 级父亲之类的东西,可以直接用倍增把两端答案拼起来,适用范围非常广

D. Odd Mineral Resource

秒出 \(n\sqrt(n)\log n\) 的莫队做法,但是没想到如何优化。注意到修改次数是 \(n\sqrt(n)\) 次,而查询操作次数是 \(q\) 次,所以可以牺牲一点查询的时间复杂度换取更快速的修改复杂度,所以直接用分块代替树状数组。

需要求一个颜色出现偶数次/奇数次是很明显的异或哈希,在主席树上二分是好做的

总结:

集合哈希和异或哈希还需要多熟悉一下。倍增还不那么熟练

8 月 7 日总结

模拟赛总结

P5536 【XR-3】核心城市

依旧是想了一个复杂的方法。实际上找到要保留多少节点不如寻找删掉多少结点,后者直接从叶子一层层删即可。对要求的东西进行一个取补或者分讨可能会简单很多

8 月 6 日总结

Muddy Fields G

对每一块可能存在的木板编号,最小割算法提示很明显了

猫咪们狂欢

相当于只用考虑两棵树上能产生贡献的边,然后就是典型的最小割题目

Four Melodies

只想到了用最大流限制序列的数量,但是没有想到最大费用最大流计算最多的点的数量。剩余的建图优化比较典,就是把同类点建到一起,减少边数。考虑有若干限制条件和可能产生的代价和贡献可以使用费用流

P2416 泡芙

重新复习一下边双连通分量怎么写

P11907 [NHSPC 2023] F. 恐怖的黑色魔物

Kruskal 重构树,有一些美妙的性质:在原图上的两点,它们之间所有最短路径的最长的一条边是重构树上它们的 LCA 的权值

8 月 5 日总结

模拟赛 T4 细节有点多,调了一个半小时才调出来。P6062 [USACO05JAN] Muddy Fields G 感觉最小割可以做,但是还没过

8 月 4 日总结

8 月 4 日模拟赛总结

8 月 3 日总结

排列组合其实挺有意思的说是,但是卡特兰数怎么这么坏。今天听图论讲题听到了一些图论算法,原来图论是所有图论算法的杂糅啊。。。

8 月 2 日总结

8 月 2 日模拟赛总结

8 月 1 日总结

也是开始做组合数提单了,但是他们都是推狮子大神吗,做的好快

重要公式:\(\sum\limits_{j = 1}\limits^{n} C_{i + j - 2}^{i - 1} = C_{j + n - 1}^{n - 1}\)

7 月 31 日总结

今天只做了 7 道题,感觉写的好慢。一遇到困难总想着看题解,应该要降低看题解的频率,多思考一下

CF1242C Sum Balance

这题就是其实就是求环能否覆盖所有点,再套上一个壳子。主要是发现每个位置只有唯一对应的位置才能替换,然后会形成若干个环。转换完题意就是状压板题

CF311B Cats Transport

显然这题和山没有任何关系,只需要知道每只猫在人什么时候出发能接到即可。写出转移式,然后是斜率优化板题

B. Ropeway

纯纯好题。如果不带修改就是一道单调队列优化 dp 模板,但是考虑带修怎么做。观察数据范围,\(k\) 只有 \(3 x 10^3\),显然时间复杂度和 \(k\) 有关。

考虑对一个点修改会对哪些点的 dp 产生贡献。如果没有改变决策点,那么最后的答案是好维护的。考虑什么时候决策点会产生变化——dp 值的相对值发生变化。

例如 \(f_x\) 的决策点由 \(x - k\) 变成了 \(p\),那么 \(p + k - 1\) 就有可能更优,所以最多影响后来 \(k\) 个点。然后用后缀 dp 优化后缀计算一下即可

7 月 30 日总结

模拟赛总结

7 月 29 日总结

数据范围能够提示 dp 类型,比如 \(n = 500\) 显然就大概率是区间 dp,类似于 ReTravel 这种比较难看出来时区间 dp 的可以通过观察数据范围得出 dp 类型。

降低 dp 转移时间复杂度可以采用预处理的方式,一般是转移与状态无关时可以采用,例如上次模拟赛 T3 C. 连续段的价值CF1874C Jellyfish and EVA

设计 dp 状态应该先保证正确性,再进行优化。

7 月 28 日总结

CF1310C Au Pont Rouge

找到方案数所对应的方案一般都是使用二分答案。优化 dp 转移还可以改变 dp 的顺序,比如这题从前往后转移因为不断更改前缀而要重新计算,但是从后往前转移,合法的能转移的状态就是一个后缀可以优化掉。

CF873F Forbidden Indices

和字符串的子串有关先按后缀排序一下。假如没有禁止的位置,就直接枚举 lcp,算出可以用的区间。如果有禁止的位置,发现若位置在最后不好处理包含一些被禁止的位置的答案,但是把他转到第一个在开头的位置,就能直接算出答案包含了多少不合法状态,去掉它们的贡献即可

还剩下一道 AC 自动机,补完 dp 再写

7 月 27 日

模拟赛总结

唉每场都考这么烂,纯菜。

复习了一下 KMP 和 manacher,感觉巧妙极了。求完全匹配完全可以把文本串和模式串拼到一起,如果 next 等于模式串的长度时就是一个答案,写起来非常方便,好调。

每天的题都补不完,只能留到第二天。还好明天没有新题单,可以补一下题

7 月 26 日

数据结构(3)剩下三道题都是扫描线好题,正好不会扫描线

P3863 序列

观察到询问是对连续的时间询问,而修改是对序列的连续段查询,不可能同时维护。将时间和下标分别看成两个数轴,发现修改产生的贡献区间是一个矩形,查询是对一个元素的时间段,相当于横坐标为 \(i\) 且纵坐标在 \([1, y]\) 之间的合法状态的个数。这就是扫描线的经典模型

A. 数据结构

显然是很难同时维护一些元素是否是第一个出现的,那么应该从元素产生的贡献角度思考

考虑一个元素 \(x\) 会对哪些区间产生贡献:包含任意一个 \(x - 1\) 或者不包含 \(x\),但是不好维护这些区间的并集。那么考虑一个元素 \(x\) 不会对哪些区间产生贡献:\([1, l)\) 没有 \(x\) 并且 \([l, r]\) 没有 \(x - 1\) 并且 \((r, n]\) 没有 \(x\),发现满足这些条件的区间的 \(l\)\(r\) 会在一些范围内,这是一个矩形

总结:扫描线是处理若干个矩形产生的贡献,做题时应该将限制条件转化为二维平面上的矩形

7 月 25 日

模拟赛

7 月 24 日

只用维护最近的点对就行了,尽量减少需要维护的东西

传送

线段树分治。和 Colorful Operations 一样的 tag 维护方式:合并的时候减去之前的 tag,回滚的时候加回来,可以刚好把在一起的时候的答案算上

T-Shirts

Solution 1:先排序,发现 \([1, c)\)\([c, 2c)\) 的数会合并到一起,不好快速维护它们的前后关系。但是可以直接暴力合并,因为暴力维护的部分一定会减去自身的一半以上,复杂度只有 \(logn\)。剩余的部分相对位置不会变,那么打个 tag 维护即可。是一种经典的折半技巧

Solution 2:考虑价格很大时可以暴力进行维护,价格相对较小时,希望能够快速跳过小价格区间。我首先想到根号分治,但是发现一段连续的小价格还是不太好维护下一个价格不够的位置。考虑对值域进行一个分层,直接二分出会导致现在价格降低层级的位置即可。需要注意的是,还得特殊考虑一下层级相同的情况,稍微有些麻烦,但是还是好维护的重要的是比第一种方法还需要写平衡树好太多了

对于数值递减/递增的问题,可以使用这两种方法

P9388 [THUPC 2023 决赛] 先人类的人类选别

发现一个操作对于答案的影响是踢掉一个区间最小值,可以考虑一个前缀的答案,是所有 \(x\) 和前缀的并集去掉前 \(i\) 个最小值的值,用一个权值线段树和主席树分别维护 \(x\) 和序列即可。区间查询应该要考虑到差分

7 月 23 日

Naive Operations

经典类型了,产生贡献的次数很少时可以直接维护与目标的距离,如果产生了贡献就暴力进行修改

竟然是多组数据,HDU 经典多组数据输入格式,没看到有多组数据,调了 2h。但是不会有第二个 OJ 的题用这种输入格式了吧/lh

P4587 [FJOI2016] 神秘数

如果没有思路直接做的话应该先想一下暴力然后考虑优化这个暴力。

上一题调好久,这一题一遍过,HDU 魅力时刻

CF1690G Count the Trains

维护多个段之间的关系,只需要维护每个段中关键点的关系即可,会简单很多。

CF1913D Array Collapse

经典 dp,以 \(i\) 为序列末尾的个数。先把递推式写出来再用方法去优化转移

P7706 「Wdsr-2.7」文文的摄影布置

线段树裸题。发现子区间的答案直接合并很难,考虑将选择的 \(B_j\) 分类讨论会在左儿子的区间出现还是再右儿子的区间出现,剩下的东西很好维护。对于整体很难维护的东西,尝试分成不同的部分分别处理。

CF1638E Colorful Operations

这题询问的是单点,那么可以着重关注一下一个点的变化。在选择要维护的东西时,应该选择更好维护的,例如这题选择动态维护单点的答案,而不是反复修改一整个颜色的东西

7 月 22 日

模拟赛

7 月 21 日

day2

C

感觉挺简单的。考虑加入一个关键点后,会将原来的一个区间分成左右两部分。对于左边的区间,发生更改的是和右端点的距离。对于右边的区间,发生更改的是左端点的权值。考虑怎么进行修改。直接将左端点的权值和右端点的位置传入即可,很容易使用线段树维护

B

之前做过了。其实就是单调队列加一点小细节。比较坑的一点是要复制两次原数组

A

有没看数据范围,竟然是个 n 方做法。直接枚举一开始选择哪个位置的数和最大数匹配。然后要凑出 \(x\),显然必须要又次大值,不然之后是无法消掉次大值的。那么直接模拟就行。思路十分自然


day1

HIJ

感觉有点难,今天还没做

G

一眼二分答案,但是 check 写错了。还是要提高纠错能力和严谨程度。。。

F

简单交互。考虑一下蛇的端点会有什么性质就出来了

E

套路题。对偶数位置颜色反转将题目转换为相邻不同颜色相消,简单很多。之前遇到过,但是没想到

D

想了一部分,剩余的区间相交部分如何处理没想明白。

ABC

今天 ABC 三题不难,但写了一整个上午。思维严谨度急需提高,写的时候根本没想到这样是错的

7 月 12 日

CF1422F Boring Queries

对这种和质因子有关的题还是要提高敏感度,没想到还能根号分支/其实不用根号分治也能做

P3332 [ZJOI2013] K大数查询

没看明白怎么把树状数组套到主席树上,只好用整体二分水果

7 月 11 日

P2839 [国家集训队] middle

思考之前是怎样求得的中位数。首先二分出一个数,显然若大于等与它的数的数量 > 小于它的数的数量,答案就不劣于当前数。那么我们可以二分答案。如何统计大于等于它的数的数量与小于它的数的数量的大小关系?将小于等于它的数设为 -1,大于等于它的数设为 1,若数列求和后结果大于等于 0,说明答案不劣于当前数。那么可以用线段树维护区间最大后缀和、最大前缀和、区间和。离散化的时候还不能去重或者当取相同的数的时候应该取(相同的数中)最后一次修改的版本

P3168 [CQOI2015] 任务查询系统

主席树模板提,但是我 tm 调了好久,一开始还看错题了

P3293 [SCOI2016] 美味

和最大异或和没什么区别,都是判断 [l, r] 区间内有没有需要的数,但是这题多了一个 x,需要用主席树了。好奇有没有单 log 做法


先把昨天遗留下来的最大异或和做了

7 月 10 日

P4735 最大异或和

显然可以转化为前缀异或,然后不会了。。。弄个可持久化 trie 解决目标是否在 [l, r] 区间里就直接做完了。。。

P2633 Count on a tree

类似于树上前缀和一样建树即可

P3834 【模板】可持久化线段树 2

重新写了一遍

P2056 [ZJOI2007] 捉迷藏

用一个 map 记录距离重心为 t 的黑点的数量应该就行了

P3241 [HNOI2015] 开店

其实是很裸的点分树 + 值域线段树,但是好像有更暴力的方法?

P6329 【模板】点分树 | 震波

点分数模板,但是调了一下午。/bx/bx/bx ylx 巨佬,抬举了

P3714 [BJOI2017] 树的难题

点分治+线段树。一开始写了个假做法,但是重新写个线段树好像不难

7 月 9 日

CF293E Close Vertices

点分治板子+二维偏序

P4149 [IOI 2011] Race

点分治模板说是。感觉被刻意卡 umap 了,被卡到 70pts

CF715C Digit Tree

点分治模板,但是要写 exgcd

P4178 Tree

淀粉模板,熟悉一下点分治

P3806 【模板】点分治 1

重新学一下淀粉质

P4332 [SHOI2014] 三叉神经树

设所有点的点权为所有儿子的信号数值之和,那么只有四种状态 0 1 2 3。假设现在修改的节点是 0 变成 1。那么不难发现产生修改的节点一定是一段连续的 1 区间。同理 1 变成 0 是修改的一段连续的 2 区间。树剖维护所有连续的 1 区间和 2 区间的 tp(表示当前连续的区间的端点)的数组以及每个点的状态即可

7 月 8 日

P3313 [SDOI2014] 旅行

对每个颜色建一棵线段树,若一个位置有点,那么对于它到根的路径上全部新建一个点(已有的不需要新建)。修改直接把这个点的权值变成 0 然后新建点就行/分块,对每一个块开长度为颜色种类数的数组,修改即可。其实代码难度还好我一下就调出来了

P12693 BZOJ3589 动态树

先把一条链拆成若干重链的拼接,这样每条链编号都是连续的,然后取区间并即可

P7735 [NOI2021] 轻重边

天才想法。我一直在想给父亲打一个 tag 表示所有儿子都是轻边,但是很明显不行,因为无法保证所有儿子都是轻边。那么再给儿子打一个 tag 不就行了?把这个 tag 当成一种颜色,然后两个点颜色不一样表示它们之间这条边是轻边。 那么就和染色这道题基本一样了,改一改就过了。

P2486 [SDOI2011] 染色

放在序列上是一道线段树模板,放在树上就是树剖模板了。写个合并给我糖丸了,线段树也斜挂了,调了一个下午。代码要在写出来的时候就要保证正确性,不然太折磨人了

P3979 遥远的国度

考虑询问的点是 x,且根节点是 rt 时,答案应该是什么。如果 rt 不在 x 的子树内,不会有任何影响。如果 rt 恰好时 x,那么答案是全局的最小值。如果 rt 再 x 的子树内,那么在 x 中所有包含 rt 的子树的点都不是 x 的新子孙,剩余的所有点都是 x 的新子孙。那么我们找到一个点 y 是 x 的儿子且 rt 也在 y 的子树内,答案就是全局对 y 子树取补的区间的答案

P2146 [NOI2015] 软件包管理器

树剖板题,但是因为小错误调了好久。调题能力绝了

7 月 7 日

P2590 [ZJOI2008] 树的统计

树剖模板了,比板子都简单。但斜挂了,明天应该就能调出来了

P5904 [POI 2014] HOT-Hotels 加强版

题解的 dp 半天没搞懂,想了半天才发现我有一种情况考虑错了。但是还是不会写,明天再补

P5290 [十二省联考 2019] 春节十二响

真没啥思路。想歪了,递归思维太菜了

CF1009F Dominant Indices

长剖模板,之前做过了

CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths

一开始写了 STL 启发式合并,虽然感觉时间复杂度是对的,但是还是错了,不知道为什么错了。还是写了 dsu on tree

[CF375D Tree and Queries]

莫队 or Dsu On Tree,都很好写

CF600E Lomsat gelral

dsu on tree 模板。或莫队也行?但是用 STL 启发式合并很好写

Make Rounddog Happy

考虑计算每个点的贡献。直接单调栈找到左右界限,直接计算即可,貌似不需要搜到的题解那样分治(?

看了眼昨晚 CF D,没看到数据范围全想歪了。数据范围还是非常重要的

7 月 5 日

P3402 可持久化并查集

主席树记录一下 fa 数组即可。bx ylx,太聪明了

P4940 Portal2

双端队列就行了。对于合并,打个是否翻转的 tag 启发式合并即可

P3224 [HNOI2012] 永无乡

一开始是写 FHQ 的,但收获了全 MLE 的好成绩,遂使用 pbds

理解性默写:

#include <bits/extc++.h>

using namespace __gnu_pbds;

tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics> tr;

P3201 [HNOI2009] 梦幻布丁

纠结了好久怎么删除相邻相同颜色,结果发现不用删除。。。

P4168 [Violet] 蒲公英

之前写暴力水过了。一看就需要预处理,但是预处理的时候脑子短路了,一下子没想到怎么处理两个快之间的众数。数组开小了,调了一个晚上 +1h。以后小数组拍不出来但是大数据一拍就有问题有可能就是数组开小了


听说今天日本有超大海啸,但是不太信说实话(8:51 a.m)

7 月 4 日

AT_joisc2014_c 歴史の研究

回滚莫队模板。调了半天以为都开了 long long,结果还有一个地方漏掉了

P5906 【模板】回滚莫队&不删除莫队

重新学了一遍回滚莫队,好像不难理解,之前为什么学不会呢。调了好久才调出来,终于差不多明白大概怎么写回滚莫队了。千万别忘了除以(模)0 也会导致 RE

AT_abc384_g [ABC384G] Abs Sum

还挺极限。果然减少 unordered_map 的使用确实变快了很多

P1997 faebdc 的烦恼

莫队模板。yq 恐怖如斯,区间众数写了个回滚莫队

AT_abc242_g [ABC242G] Range Pairing Query

好久没写莫队了,全忘了。复习了一下莫队的小优化

P5356 [Ynoi Easy Round 2017] 由乃打扑克

STL 是真的慢,需要卡常的时候优先减少 STL 的使用次数

Chef and Churu

好久没写数据结构了,现在写分块查询都忘记怎么写了。线段树常数好大

7 月 3 日

CF1039D You Are Given a Tree

根本看不出来的神仙根号分治。把之前的代码调过了。当树上 dp 调用次数多且复杂度正确被卡了的时候,可以尝试拍成 dfn 再跑 dp,省去递归时间

P8250 交友问题

主要是没想到可以用 bitset 优化,不然还是挺好想的一道根号分治

CF985G Team Players

三元环计数板题,套了个容斥的外壳。

先设 \(SA\)\(SB\)\(SC\) 表示 \(A\)\(B\)\(C\) 分别的数量。用一般三元环计数的方法规定边的方向

  1. 计算总贡献:枚举 \(i\) 为中间,那么有 \(SA += (n - i - 1) * \dfrac{(0 + i - 1) * (i - 1 - 0 + 1)}{2} = (n - i - 1) * \dfrac{i * (i - 1)}{2}, SB += i * (n - i - 1) * i, SC += i * \dfrac{(i + 1 + n - 1) * (n - 1 - (i + 1) + 1)}{2} = i * \dfrac{(i + n) * (n - i - 1)}{2}\)
  2. 去掉有一条边的贡献:设有一条边 \(x < y\),那么可能有
    • \(z < x < y\),即 \(SA -= \dfrac{x * (x - 1)}{2}, SB -= x * x, SC -= x * y\)
    • \(x < z < y\),即 \(SA -= x * (y - x - 1), SB -= \dfrac{(x + y) * (y - x - 1)}{2}, SC -= y * (y - x - 1)\)
    • \(x < y < z\),即 \(SA -= x * (n - y - 1), SB -= y * (n - y - 1), SC -= \dfrac{(y + n) * (n - y - 1)}{2}\)
  3. 加上有两条边的贡献:枚举点 \(x\) 作为两条边的共顶点。统计与 \(x\) 连边且小于 \(x\) 的数量 \(p_x\),和大于 \(x\) 的数量 \(q_x\)。从小往大枚举与 \(x\) 相连的点 \(y\)
    • \(y < x\)
      • \(z < y < x\),设 \(z\) 的数量为 \(t\)\(z\) 的和为 \(s\),那么有 \(SA += s, SB += t * y, SC += t * x\)
      • \(y < z < x\),与上重复
      • \(y < x < z\),设 \(z\) 的数量为 \(t'\)\(z\) 的和为 \(s'\),那么有 \(SA += y * t', SB += x * t', SC += s'\)
    • y > x
      • \(x < y < z\),重复
      • \(x < z < y\),设 \(z\) 的数量为 \(t\)\(z\) 的和为 \(s\),那么有 \(SA += x * t, SB += s, SC += y * t\)
      • \(z < x < y\),重复
  4. 去掉三元环的贡献:三元环计数模板,注意每个三元环会被重复计算三遍

P1989 无向图三元环计数

三元环计数板题

AT_abc259_h [ABC259Ex] Yet Another Path Counting

可以想到两种做法

  1. \(f_{i, j, s}\) 表示颜色 \(s\) 在以 \(i, j\) 为结尾的答案数量有多少个。那么有 \(f_{i, j, s} = f{i - 1, j, s} + f_{i, j - 1, s}\),当 \(s = c_{i, j}\) 时累加答案。时间复杂度为 \(n^2 \sum C_i\)
  2. 对于每一种颜色暴力枚举统计答案,时间复杂度为 \(\sum C_i^2\)

根号分治就行。数组开小了跳了好久

7 月 2 日

CF1921F Sum of Progression

k 和 d 的乘积小于等于 n,于是发现这是根号分治。对于 \(d\) 很小的情况,维护后缀和 \(s_{i, d}\) 表示以 \(i\) 开始的后缀中,每、间隔 \(d\) 就求和的值。再维护后缀的后缀 \(s'_{i, d}\)。容易发现最后的答案就是 \(s'_{i, d} - s'_{i _ kd, d} - (k - 1)s_{i + kd, d}\)


看了眼昨晚上的 CF,感觉除了最后一题数论不熟以外都还好

也是把一个 dp 题单做完了,不想写 dp 了


CF671D Roads in Yusland

按照一般的套路设计状态行不通了,因为包含当前节点的路径还会对祖先有贡献。那么我们的状态设计必须包含这个可能的贡献。于是设 \(f_{i, s}\) 表示将 \(i\) 子树内和 \(i\) 的父亲边全部覆盖且往上走的链最长还能走 \(s\) 的最小代价。当我们钦定一个儿子 \(k\) 为转移到 \(f_{i, s}\) 的点时,其它儿子能到达的最浅的路径深度不能比 \(s\) 小,也就是 \(f_{i, s} = \min(\sum\limits_{j \neq k}\min\limits_{c \leq s + 1}(f_{j, c}) + f_{k, s + 1})\)。若有以 \(i\) 节点为末尾的一条路径,假设其长度为 \(k\),代价为 \(v\),那么有 \(f_{i, k} = \min\limits_{c \le s}(f_{i, k}, f_{i, c} + v)\)。应该是可以用长链剖分和前缀 min 优化的。哎,前缀 min 还要个树状数组维护一下。

CF1016F Road Projects

好像做过类似的(?

这题有点意思。显然选的 \(u, v\) 是不变的,那么我们就是要最大化 \(\max(\min(w_{1, u} + w_{v, n}, w_{1, v} + w_{u, n}))\)。但是这个式子有两个未知数,还要在两种取法里取最小的那个,非常不好搞。考虑把 \(1\)\(n\) 的链先拉出来,找找性质。发现这条链上每一个点的子树内,需要用到的点只有离它最远的点,设这个距离为 \(f_i\)。现在原本在树上的问题转化为了一条链上的问题。那么假设 \(u < v\),显然 \(w_{1, u} + f_u + w_{v, n} + f_v < w_{1, v} + f_v + w_{u, n} + f_u\),那么直接算即可。哎怎么漏了一种情况当一个点的子树有三个及以上的点时,总能找到一条边连接同一子树内没有边直接连接的两点,这样这条新增边就对答案没有任何贡献了。还要注意相邻两个点如果没有子树的话是不能更新的,所以同时还要记录一个次大值,保证最大值和次大值至少有一个能用

CF543D Road Improvement

不是这 2300 都能评为紫题吗。。。

转移式子和 AT_dp_v Subtree(蓝题) 一样。它们其实就是等价的,此题转换成这道 AT 上的题的话就是说:任意白色连通块内的点和任意黑色连通块内的点中间途径的不同颜色连通块交界边的数量至多为 1,求当点 \(i\) 为黑色点时,方案数数量

7 月 1 日

CF512D Fox And Travelling

树形 dp,每一步都很好想。首先环上的点肯定不选,那么先做一遍拓扑排序。然后剩下一堆有根树(连接了环)和无根树(没有连接环)。对于有根树直接进行一遍树形 dp 即可。对于无根树枚举每个点作为根。注意到对于每个选了 \(k\) 个点的方案,都会在以剩下 \(s - k\) 个点为根时算一次,所以除以 \(s - k\) 即可

P4516 [JSOI2018] 潜入行动

树上背包。设 \(f_{i, j, 0/1, 0/1}\) 表示在点 \(i\),子树全部被监视了,其中放了 \(j\) 个监视器,\(i\) 没有/有 被监视,\(i\) 没有/有放监视器,直接转移即可。我以为这是 \(O(nk^2)\)就不会做了,原来加点优化就是 \(O(nk)\) 的啊。。。

理顺一下转移思路:

  1. 现在没有被监视且没有放监视器。那么对儿子的要求是它必须已经被监视了且它必须没放监视器

\[f_{i, j, 0, 0} = \sum\limits_{s \in son, k \leq \min(j, sz_s)}f_{i, j - k, 0, 0} \cdot f_{s, k, 1, 0} \]

  1. 现在没有被监视但放了监视器。那么对儿子的要求仅仅是必须没放监视器

\[f_{i, j, 0, 1} = \sum\limits_{s \in son, k \leq \min(j, sz_s)}f_{i, j - k, 0, 1}(f_{s, k, 1, 0} + f_{s, k, 0, 0}) \]

  1. 现在被监视了但没放监视器。稍微复杂一点。假设我现在仍然没有被监视,我需要儿子放监视器监视我。假设我现在已经被监视了,那么儿子放不放监视器都可以。但对儿子的要求都是必须已经被监视了。主要虽然这里面左边和右边写的都是 \(f_{i, j}\),但实际上它们不属于同一层,需要上一层的答案进行转移

\[f_{i, j, 1, 0} = \sum\limits_{s \in son, k \leq \min(j, sz_s)}(f_{i, j - k, 0, 0} \cdot f_{s, k, 1, 1} + f_{i, j - k, 1, 0}(f_{s, k, 1, 0} + f_{s, k, 1, 1})) \]

  1. 现在被监视了且放了监视器。在 3 的基础上对儿子放开是否被监视了的条件

\[f_{i, j, 1, 1} = \sum\limits_{s \in son, k \leq \min(j, sz_s)}(f_{i, j - k, 0, 1}(f_{s, k, 0, 1} + f_{s, k, 1, 1}) + f_{i, j - k, 1, 1}(f_{s, k, 0, 0} + f_{s, k, 0, 1} + f_{s, k, 1, 0} + f_{s, k, 1, 1})) \]


重新复习了一下长剖,感觉非常厉害,在处理与点深度的问题的时候时间复杂度非常优秀

CF1009F Dominant Indices

长剖板题

6 月 28 日

ABC412

A

弱智

B

弱智

C

弱智,但是有一点细节

D

数据范围弱智,有更优的置换做法是 \(n!\) 的,但是我直接爆搜每条边存不存在+判掉不合法状态和重复状态过了

E

有点蠢,一开始把 \(lcm\) 搞成了乘法,但是看了样例应该能改过来。剩下的就是弱智部分了

F

没看

G

没看

CF708C Centroids

想到把重心作为根了,但是后面的就没想到了。考虑中心的儿子会有什么性质——子树的大小 \(\leq \dfrac{n}{2}\),所以操作是将父节点的一颗符合条件的子树接到这个点上,那也就意味着可以利用父节点和这个点的关系了

考虑这个子树应该满足什么条件。显然把它拿掉后父亲节点的大小就需要小于 \(\dfrac{n}{2}\),那么父亲节点子树中最大的 \(size \leq \dfrac{n}{2}\) 的子树是最优的。直接换根求出最大的子树的大小即可

P3959 [NOIP 2017 提高组] 宝藏

非常厉害的一道 dp 题。由于代价由深度和边权共同控制,所以状态必须包含这些信息。设 \(f_{r, s}\) 表示目前放了 \(r\) 层,放入的点集为 \(s\),转移时非常好想的。

有一些细节,调了好久:

  1. 合并两个区间的时候,方向是一定的,并不对称
  2. 如果无法做到使两个区间联通,代价要设为无穷大
  3. 有重边

UVA12991 Game Rooms

简单 dp。设 \(f_{i, 0/1}\) 表示第 \(i\) 层放游泳池还是乒乓球桌。假设从 \(j\) 转移过来且距离 \(i\) 最近的相同设施的位置为 \(j\),设 \(k = \dfrac{i + j}{2}\),那么显然有 \(f_{i, o} = min(f_j + p_{j, k, o} + q_{k + 1, i, o})\),其中 \(p_{j, k, o}\) 表示 \(j\)\(k\) 中要到 \(o\) 的人中,全部走路到 \(j\) 的代价。\(q_{k + 1, i, o}\) 类似的。考虑 \(p_{j, k, o}\) 如何计算。考虑预处理,枚举 \(l\),设 \(s_{r, o} = \sum\limits_{l \leq j \leq r}a_{j, o}\),假设 \(pre_{i, o} = \sum\limits_{l \leq j < r}a_{j, o} \cdot (r - j) = r\sum\limits_{l \leq j < r}a_{j, o} - \sum\limits_{l \leq j < r}a_{j, o} \cdot j = rs_{r - 1, o} - \sum\limits_{l \leq j < r}(s_{r, o} - s_{j - 1, o}) = rs_{r - 1, o} - (r - l)s_{r, 0} + \sum\limits_{l \leq j < r}s_{j, o}\),其中的每一项都可以一边枚举 \(r\) 一边算出来。那么此时 \(p_{l, r, o} = pre_{r, o}\)\(q_{k + 1, i, o}\) 同理,于是便可以 \(O(Tn^2)\) 过掉此题。代码有亿点细节

6 月 27 日

CF235B Let's Play Osu!

重新学了一下概率期望 dp

假设 \(E(r_i)\) 表示经过 \(i\) 轮操作后的期望连击个数。若第 \(i\) 次操作成功,贡献是 1。若失败,则清零。那么有 \(E(r_i) = p_iE(r_{i - 1} + 1) + (1 - p_i) * 0 = p_i(E(r_{i - 1}) + 1)\)

经过第 \(i\) 次操作后,若成功,那么贡献了 \((r_{i - 1} + 1)^2 - r_{i - 1}^2 = 2r_{i - 1} + 1\)

\(f_i\) 表示经过 \(i\) 次操作后的总分,\(E(f_i)\) 表示 \(i\) 次操作后总分的期望。若成功,那么贡献则为 \(E(f_{i - 1} + 2r_{i - 1} + 1)\)。若失败,那么贡献为 \(E(f_{i - 1})\)。那么有 \(E(f_i) = p_iE(f_{i - 1} + 2r_{i - 1} + 1) + (1 - p_i)E(f_{i - 1}) = E(f_{i - 1}) + p_i(2E(r_{i - 1}) + 1)\)

同时递推 \(E(r_i)\)\(E(f_i)\) 即可

P5504 [JSOI2011] 柠檬

看出来每个决策点 \(j\) 只会是 \(Col_i = Col_j\),斜率优化推一推很好写了(但是我调了半天还是只有 82pts)

CF1579G Minimal Coverage

显然答案不超过 \(a_{max}\),这允许我们使用 \(O(nV)\) 的算法。考虑 \(dp\),状态设计要包含 左端点、当前位置、右端点 的信息,由于我们只关心它们的相对位置,那么可以令 \(f_{i, j}\) 表示考虑到了前 \(i\) 条线段,到左端点为距离 \(j\) 的到右端点最短的距离。转移是简单的

6 月 26 日

今天一直在调题还一直调不出来,真有意思

CF940E Cashback

有点意思。注意到选择的区间长度不可能大于 \(2c\),因为分开后最小的数的和一定不小于合并的区间中最小的数的和。考虑设 \(f_i\) 为到当前 \(i\) 最小的答案。可能在 \(i\) 切一刀,此时答案为 \(f_{i - c} + s_i - s_{i - c + 1} - w_{i - c + 1, i}\),其中 \(w_{i - c + 1, i}\) 为这一段 \(a_k\) 的最小值。还有可能从 \(f_k\) 转移过来,其中 \(i - c + 1 \leq k < i\),但是注意到 \(f_{i - 1}\) 一定包含 \(k\)\(i - 1\) 的答案(注意不到也能做),所以这一段的答案为 \(f_{i - 1} + a_i\),综上 \(f_i = \min({f_{i - c} + s_i - s_{i - c + 1} - w_{i - c + 1, i}, f_{i - 1} + a_i})\)

6 月 25 日

P8756 [蓝桥杯 2021 省 AB2] 国际象棋

和互不侵犯完全一样,斜挂了,再也不写这种东西了

CF2074G Game With Triangles: Season 2

好久没写过区间 dp 了,拓扑序搞错了一开始

简单区间 dp,显然选 \(i, j, k\) 的三角形会把 \([i, k]\) 分成两部分,加起来就是这段区间里的答案了

P11233 [CSP-S 2024] 染色

md 这么简单我去年怎么没做出来啊

先把相邻的相同的数合并,显然它们是同色的,贡献提前加上。设 \(f_i\) 表示到第 \(i\) 个位置的最大值,考虑如何转移

假设 \(j\) 是最靠近 \(i\) 的同色数,\(j < i - 1\),那么

  1. \([j + 1, i - 1]\)一定是同色的,且因为没有相邻的相同数,所以区间 \([j + 2, i - 1]\) 产生的贡献是 0,即 \(w_{[j + 2, i - 1]} = 0\)
  2. \(a_j \neq a_i\),则无贡献,从 \(j\) 转移一定不比从 \(i - 1\) 转移更优,所以 \(a_j = a_i\)
  3. \(j + 1\) 可能产生贡献,为了最优化,那么从 \(j\) 转移的答案为 \(s = f_{j + 1} + w_{[j + 2, i - 1]} + a_i = f_{j + 1} + a_i\)
  4. 假设有 \(k\) 满足 \(k < j < i\)\(a_k = a_j = a_i\),显然 \(f_j \geq f_k\),那么从 \(j\) 转移一定不必从 \(k\) 转移劣

综上,有 \(f_i = \min(f_{i - 1}, f_{j + 1} + a_i)\),其中 \(j\) 为最近的 \(a_j = a_i\) 的位置。\(j\) 预处理即可

CF1324F Maximum White Subtree

换根 dp,设 \(f_i\) 表示以 \(i\) 为根的子树中且必选 \(i\) 的答案,设 \(g_i\) 表示 \(i\) 的答案,转移即可

CF1083A The Fair Nut and the Best Path

显然答案路径是树上的一条简单路径,设 \(f_i\) 表示以 \(i\) 为根的子树内,端点为 \(i\) 的最大的答案,转移即可

CF2112E Tree Colorings

考虑两棵树合并的方案变化,假设两棵树的方案数分别为 \(u, v\),那么新树的方案数为 \(u * (v + 2)\)\(v * (u + 2)\)。设 \(f_i\) 表示当方案数为 \(i\) 时,所需的最小结点数。那么有 \(f_{i * (j + 2)} = \min(f_{i * (j + 2)}, f_i + f_j), f_{(i + 2) * j} = \min(f_{(i + 2) * j}, f_i + f_j)\),发现能转移到的点都是奇数

6 月 24 日

CF2112

A

口胡一下判一下 \(a\) 是不是在 \([x, y]\) 之间就行了

B

口胡一下正着倒着分别扫一遍,对于第 \(i\) 个区间 \([l, r]\),对 \([l - 1, r + 1]\) 赋值为 \(i + 1\),若 \(a_j\) 在此范围内,答案即为 \(|i - j|\)(欸不是,这题只会出现 0、-1、1 吗,这么牛)

C

口胡一下枚举 \(i < j\),求出 \(j < k\)\(a_n - a_i - a_j < a_k\)\(k\) 的数量,特判 \(k = n\)

D

每条边都至少有 1 的贡献,那么显然有且仅有一条长度为 2 的路径。注意到必须要有一个结点恰好度数为 2 才满足条件

AT_abc387_f [ABC387F] Count Arrays

可以用拓扑排序或者缩点把原图变成有向无环图,我都写了一遍但是拓扑排序斜挂了。。。然后就是简单的树形 dp,设 \(f_{i, j}\) 表示当第 \(i\) 个点数值为 \(j\) 时,子树的方案数,然后转移就行了

AT_dp_v Subtree

明显的换根 dp。

先考虑以 1 为根的答案怎么求。设 \(f_i\) 表示当 \(i\) 号结点为黑色时,有 $f_i = \Pi (f_{son} + 1) $

考虑换根,假设现在的结点为 \(x\),向 \(y\) 换根。设 \(g_i\) 表示 \(i\) 号结点的父亲除了 \(i\) 号子树的答案。对于每个点,有答案 \(ans_i = f_i \cdot g_i\) 显然 \(x\) 可能是黑色也可能是白色。若是白色,方案数为 \(1\)。若是黑色,设 \(res = \Pi (f_{brother} + 1) = \dfrac{f_x}{f_y + 1}\)\(res\) 可以用前缀积和后缀积或者求逆元(扩欧)求得 ,有方案数 \(s = \dfrac{ans_x}{f_y + 1} = \dfrac{f_x \cdot g_x}{f_y + 1} = g_x \cdot res\)。此时有 \(g_y = s + 1\)

AT_dp_p Independent Set

\(f_{i, 0/1}\) 表示这个点染成白色/黑色的方案数

AT_abc259_f [ABC259F] Select Edges

\(f_{i, 0/1}\) 表示 \(i\) 号结点的父亲边有没有被选择,随便转移

P4177 [CEOI 2008] order

此题和 太空飞行计划 略有不同,但总体还是一样的,考虑相似的建图即源点与正权点相连、汇点与负权点相连。

思考租用的机器应该怎么处理

首先想到增加负权点,但是如果与其它点直接相邻相当于强制绑定,无法做到租用与购买二选一。

如果要从租用和购买之间选择其一,考虑最小割的本质就是在选择割掉正权点还是选择负权点,可以想到增加连边的方法。如果要是在 舍弃正权点、选择租用、选择购买 之间选择其一,可以从 正权点 向 负权点 再连接一条容量为 租用费用 的边,解决了不同租用方案互相独立的问题

启示:网络流题目建图通常有 新增点 和 新增边 两种手段,可以从两个方面入手

P4174 最大获利

太空飞行计划、方格取数 基本上一样的建图,将正权和负权分组连向源点和汇点,容量为其权值的绝对值。跑最小割即可

posted @ 2025-06-25 08:30  sb-yyds  阅读(144)  评论(7)    收藏  举报