韬钤录 2
\(\boldsymbol{[2025/07/19]}\)
ARC201B
姑且理解为填二进制位的思想。省队集训 D6T3 感觉思想也挺类似。
先假设权值恰好为 \(W\),否则可以往 \(2^{0},2^{1},\cdots,2^{59}\) 各补一个价值为 \(0\) 的物品。
我们考虑贪心,因为物体权重是 \(2^i\),所以一个物体权重为 \(2^{i+1}\) 可以用两个物体权重为 \(2^i\) 合成,而权重大物体又不能向下分解,我们考虑从最低位向上推进。
若 \(W\) 为奇数,则我们补价值最大的 \(1\) 使得其变为偶数。
若 \(W\) 为偶数,则 \(1\) 必定要选偶数个,我们显然可以把 \(1\) 两两配对变成 \(2\),然后全部 \(/2\) 递归,当然不用真的 \(/2\),拿个东西记一下就行。
复杂度 \(\mathcal{O}(n\log W)\)。
这个题的变进制版本:P12966 CCO 2025 D1T3。
\(\boldsymbol{[2025/07/27]}\)
ABC416G
不妨 \(n,k\) 同阶。设最大字符串长度为 \(L\),我结合两个题解的做法,这里给出一个 \(\mathcal{O}(nL+L^2)\) 的好想好写做法。
官方题解结论
定义偏序关系 \(A\prec B\) 表示 \((A+B,A)<(B+A,B)\),其中 \(<\) 是字典序 \(<\),而 \(()\) 比较表示 pair 比较。
那么答案一定是 \(\left(\min\limits_{\prec} S_{i}\right)^{\infty}\) 的前缀。
证明就考虑先证 \(k\to \infty\) 的时候答案是 \(\left(\min\limits_{\prec} S_{i}\right)^{\infty}\)。
然后 \(k\) 有限的时候,若答案 \(ans_k\) 不是其前缀,则 \(ans_k^{\infty}<\left(\min\limits_{\prec} S_{i}\right)^{\infty}\) 矛盾。
maspy 题解 结论
注意到 \(B<C\Leftrightarrow A+B<A+C\),但是 \(B<C\nLeftrightarrow B+A<C+A\)。
于是我们可以从后往前贪心,具体得:
-
初始化 \(ANS\) 为空字符串。
-
选择 \(S_i\),使得 \(S_i + ANS\) 字典序最小,然后贪心插入 \(ANS\gets S_i + ANS\)。
这篇是可以直接维护的,具体参考链接里的题解。
结合
但是我们不如把两者结合起来。
记 \(T=\min\limits_{\prec} S_{i}\),那么 \(T^{\infty}\) 的前缀一定是 \(T^{k}+T[1\sim x]\),
这表明了 \(ans\) 非 \(T^k\) 部分一定是 \(T\) 的一个前缀,即长度 \(\le |T|\)。
于是我们执行第二篇题解的过程,直到长度达到 \(|T|\),再往前加 \(T^k\) 补齐次数即可。
代码好写的,跑得飞快。
花絮
注意到赛事的 这份代码 和我的做法是等价的,不过他没有像我这样发现这么多东西,感觉是猜结论选手。
不过还是要感谢这份代码,启发我想到这个思路。
\(\boldsymbol{[2025/07/30]}\)
ARC197E
计数题算不出来,要么是对象太难缠,要么是计数方法没选对。
这篇题解 写得非常好,我懒得再复述了。讲几个方法问题。
-
为什么选四个下角的点计数?因为他们代表的 性质最强,并且性质很统一,能够一起考虑。
-
为什么是做一步容斥而不是把所有条件写出来再算?因为容斥后 情况数少,全部写出来,最后推式子也得像容斥那样算。
P13523
几乎是板子题,题解
令人闻风丧胆的英文名称
\(\boldsymbol{[2025/08/09]}\)
P13643
首先容易想到询问 \((x,y),(y,z)\) 这样的结构,不然没法把多个信息关联起来。
随便选 \(3\) 个数 \(x=1, y=2, z=3\),并询问 A = _max(x, y) 和 B = _max(y, z)。
我们令 \(u:4\to n\) 扫描:
若 \(A = B\),则说明 \(a_y = A\),将 \(y\gets u\) 重新计算 \(A,B\)。
若 \(A < B\),则说明 \(a_z = B\),将 \(z\gets u\) 重新计算 \(B\)。
若 \(A > B\),则说明 \(a_x = A\),将 \(x\gets u\) 重新计算 \(A\)。
注意到 \(A\neq B\) 的时候信息复用较多,因为保留了 \(y\)。
记 \(A=B\) 的次数为 \(C\),则总操作次数为 \(n+C+\mathcal{O}(1)\)。
我们需要做的是最小化 \(C\)。
因为交互库不自适应,显然不可避免的使用随机的东西。
比如直接随机排列,但是有点小问题,大概做到 \(C\sim \dfrac{1}{2}n\) 次左右,但是还是太大了。
其实优化也非常简单,只需要在 \(A = B\) 的时候令 \(x' = x, y' = z, z'=u\) 就好了。此时 \(C\sim \log n\)。
为啥捏?
而看我们的 \(y\),当 \(A \neq B\) 的时候值不变,当 \(A = B\) 的时候会变成一个 比自己大的随机数,所以 \(y\) 只期望变化 \(\log n\) 次。
-
注意最后两个数不知道咋填,于是花一次
_ask确认哪个是对的即可。 -
仔细思考直接随机排列为啥错?因为 \(y\) 比较关键,直接动 \(y\gets u\) 的话没啥性质,期望一半也挺合理的。让 \(y\gets z\) 能一定变大,就做完了。
P13645
数论题,懒得再复述题解了。核心就是拆 \(\sigma(ij)\to \sigma(i)\sigma(j)\) 状物。
P13682
推式子,题解。
\(\boldsymbol{[2025/08/10]}\)
P13689
和 P11192 差不多,就是有限域 \((x,x^3)\) 的构造扩展成 \((x,x^3,\cdots,x^{2k-1})\) 即可。
由于包含 \(0\),于是 \(k\) 奇数的时候直接 \(+1\) 即可。
\(\boldsymbol{[2025/08/11]}\)
ARC167C
对每条边算贡献,按 \(a\) 排序。
考虑 Kruskal 过程,我们只关心所有方案下 \(\le a_i\) 的边选了多少,记作 \(f_i\)。
则答案为 \(\sum\limits_{i=2}^n a_i(f_i-f_{i-1})\)。
\(f_i\) 就枚举 \(\le a_i\) 构成的下标集合,计算下发现 \(f_i=i!(n-i)!(i-1)\left(\dbinom{n}{i}-\dbinom{n}{k}\right)\)
复杂度 \(\mathcal{O}(n)\)。
CF1062F
等价于原图和反图可达点 \(\ge n-2\)。
拓扑排序 \(x\) 出队时,队列里所有点都和 \(x\) 互不可达。
分讨此时队列里还剩 \(res_x\) 个点。
-
\(res=0\):剩下的点均可达,直接加上。
-
\(res=1\):考虑剩下 \(y\)。此时 \(y\) 一定是删除的那个点,\(x\) 合法当且仅当 \(y\) 的所有可达点都是 \(x\) 可达。显然只需考虑一层可达(普通有向边)即可。
相当于判断 \(y\to u\) 是否都满足此时 \(\deg=1\),并且拓扑序的时候动态减少 \(\deg\)。
-
\(res\ge 2\):一定不合法。
然后原图反图各做一遍即可。复杂度线性。
AGC044C
S 操作是 trie 树上换儿子,直接打子树换的标记。
R 操作是 从低位到高位 考虑,每次循环位移 \(0,1,2\) 儿子,然后为了处理进位递归进 \(0\) 儿子那颗子树继续做。
复杂度 \(\mathcal{O}(3^N+|T|N)\)。
- 注意和传统
trie不一样的地方是 从低到高 而不是 从高到低。
ARC191D
最短路分讨,注意细节。
ARC190B
考虑从大到小剥 \(L\) 形,发现最终第 \(k\) 个 \(L\) 形 所在的方框 的左上角一定是 \((x,y):1\le x,y\le n-k+1\)。
然后枚举 \((a,b)\) 在哪条边,对四个端点处容斥一下,组合数用线性递推拆组合数即可。
最后记得 \(\times 4^{k-2}\) 表示比 \(k\) 小的 \(L\) 该怎么填。
容易用脚维护做到线性。
\(\boldsymbol{[2025/08/12]}\)
模拟赛
前两题没遇到什么困难,1.5h 通过。
但是第三题 dp 式子推久了一点,复杂度带 \(\log\),被正解卡常了,没有满分。应该学习到这题拆贡献的思想,并且提升自己想题的速度。
第四题暴力能很高分,但是也是时间问题,只获得了 \(40\) 分。因为到这里已经不到 \(20\) 分钟了。
下次在增加第三题想题速度的同时,给第四题预留 \(>30\min\) 的时间,足够写很多暴力分了。
P6544
线段树用脚维护。
CF1334F
\(\mathcal{O}(n\log n)\) 做法是好做的。
线性做法是你发现 dp 转移间那个贡献不好算。但是发现贡献差分很好算。
就把差分记到 dp 状态里,再补回去即可。
200217
\(\boldsymbol{[2025/08/13]}\)
AGC048D
观察到答案有单调性,即 \(a_l\) 先手必胜,则 \(a_l+1\) 先手必胜。\(a_r\) 同理。
于是记录 \(f_{l,r}/g_{l,r}\) 表示 \([l,r]\) 区间中,\(a_l/a_r\) 至少要修改成多少才能使得 先手/后手 必胜。
区间 dp 一下做完了。
ARC190E
一般图最大匹配存在类似 Hall 定理的结论。
WX-78 与遗迹
Monster Hunter 问题 存在偏序关系!!!
\(\boldsymbol{[2025/08/14]}\)
模拟赛
T1 注意到答案一定能在一些很极端的点取到,30min 通过,还行。
T4 大概 30min 相出做法,然后欧拉回路写挂花了将近 1h 调,下次不能犯这种低级错误。
然后 1.5h 思考过了 T2,十几分钟打了 T3 暴力发现会了,但是正解来不及写。
感觉 T2 难度超出 noip 预期,但是自己身上的问题是 T4 犯了低级错误,调试的时候还是应该冷静,不能太过着急。
箱子
二维数点优化 dp 板子题,场上没时间写了。\(l,r\) 边界有点问题,特判一下。
P12969
循环位移前缀和结论题。
\(\boldsymbol{[2025/08/15]}\)
Fast as Fast as Ryser
分阶段 dp
\(\boldsymbol{[2025/08/16]}\)
P13699
这个东西有个很优美的生成函数,就是前半部分是 \(\dfrac{(1-2x)(1+2x)^m}{1-x}\),但是很遗憾最后一步无法优于 \(\mathcal{O}(n^2)\)。
P4194
二分然后上下界网络流板子。
\(\boldsymbol{[2025/08/17]}\)
P9361
倍增,记录 \(f_{i,j,k}\) 表示 \(i\) 跳 \(2^j\) 步到第 \(k\) 个序列最前的位置。
为什么想到倍增呢?首先最小次数 \(l\) 这种东西具有一些提示性。
并且跳跃这种东西不太好二分,但是这个信息是可以合并的。于是就想到用倍增做。
AT_wtf22_day1_d
限制是比较简单的线性限制,就应该尝试对偶。
对偶完能转化成求每个位置覆盖次数 \(\le x\),求最多能选区间 \(f_x\)。
考虑增量构造,每次选择右端点最小的,然后继续找没有 \(=x\) 的右端点最小的。
用若干线段树维护这个过程,每个区间只会插入一次,复杂度显然是对的。
\(\boldsymbol{[2025/08/19]}\)
魔法
根号 \(\log\) 乱草,有点小神秘的题。没想到离线。
uoj 453
答案只和矩阵的秩相关,\(q-analog\) 数一下即可。
核心只取决于动态维护矩阵的秩,待删除线性基维护。
具体地:记录每个数是由线性基里的哪几个拼出来的,删的时候如果有一个数被它拼出,就用这个代替删的数,然后重新算下贡献。
\(\boldsymbol{[2025/08/20]}\)
qoj 967
先开 \(N\) 颗线段树,每棵树 \(T_i\) 存储从每个集合里是否有 \(col_i\)。
计算答案时一个节点 \(x\) 的答案 \(Ans_x = \max\limits_{i=l}^r \{\text{mex}(S_i)\} = \max\{Ans_{ls_x}, Ans_{rs_x}\}\), 即两个儿子的答案最大值。
但是维护一个节点的 \(\text{mex}\) 是 \(\mathcal{O}(n)\) 的,并且不支持标记。
接下来把 \(\text{mex}\) 看成没出现的最小数,然后把贡献拆分到线段树上。有点像做个差分一样的东西。
先把每个节点 \(j\) 对每个颜色 \(x\) 分为 \(0, 1, 2\) 三种状态,分别是:
-
\(state_{j,x} = 0: \sum\limits_{i=l}^r \mathbb{1}[col_x \in S_i] = 0\)
-
\(state_{j,x} = 1: 0 < \sum\limits_{i=l}^r \mathbb{1}[col_x \in S_i] < r - l + 1\)
-
\(state_{j,x} = 2: \sum\limits_{i=l}^r \mathbb{1}[col_x \in S_i] = r - l + 1\)
即完全没有覆盖,部分覆盖和全覆盖。
于是对于一个点,我们额外维护一个集合 \(A_x\),满足 \(\forall i \in [1, N], i \in A_x \Leftrightarrow state_{x,i} = 0 \land state_{\left\lfloor \frac{x}{2} \right\rfloor, i} = 1\)。
注意这里根节点要特判一下,如果颜色 \(i\) 没有出现过也要当 \(state_{1,i} = 1\)。
令从节点 \(i\) 到 \(root\) 的路径为 \(p_{i \to root}\)
注意到,一个叶子结点 \(i\) 的 \(\text{mex}\) 就是 \(\min\limits_{j \in p_{i \to root}} \left\{\min\limits_{k \in A_j} k\right\}\)。也就是路径上每个点的 \(A\) 的最小值的最小值。不懂的读者可以自己画一画。
这样就可以把之前的柿子 \(Ans_x = \max\{Ans_{ls_x}, Ans_{rs_x}\}\) 转化成 \(Ans_x = \min_{i \in A_x} \{\min\{i, \max\{Ans_{ls_x}, Ans_{rs_x}\}\}\}\)
这样每个节点 \(x\) 开一个 set 存一下 \(A_x\),这样每个节点 pushup() 的时间复杂度是 \(\log n\) 的,query() 的时间复杂度是 \(\log^2 n\) 的。
但是,这都是基于对每个颜色操作不交的前提,所以需要使用 set 来在线维护没有被修改的区间,然后对每个区间进行修改。
复杂度 \(\mathcal{O}(n\log ^2 n)\),跑挺快,数据挺水。
ARC204B
对于每个置换环考虑,相当于在环上连一个边不交的树,贡献是边的两个端点同余的个数。
直接区间 dp 即可,转移枚举 \(l\) 的连边情况,要么 \(f_{l,r}\gets f_{l+1,r}\),要么 \(f_{l,r}\gets f_{l+1,k}+f_{k,r}+1\),并且满足 \(f_{l}\equiv f_k\pmod n,k\in [l+1,r]\)。
复杂度 \(\mathcal{O}(n^2k^3)\)。
P4704
把这题看成最小覆盖,然后等价于做最大独立集。然后 独立 的条件就是线段不交。
取短的那条弧,拍到区间上。然后你考虑从 \(1\) 开头做一遍,求出每个前缀的最大答案 \(\max\)。
然后考虑跨过 \(1\) 的区间是否能让答案增加 \(1\),考虑 \((x,y)\) 这个区间,只需考察 \([1,y]\) 的最大答案是否为 \(\max\),并且最大右端点 \(\ge x\)。
dp 的时候顺便记一下最大右端点。复杂度是高贵的线性!
\(\boldsymbol{[2025/08/21]}\)
P3789
写出二元 GF:\(ans_{n,k}=[x^ny^k]\dfrac{1-x(y-2)}{1-x(y+1)+x^2(y-2)}\)
然后把 \(y\) 看成常量,写出答案:
然后微分有限,写出线性递推,然后复杂度就是线性!
\(\boldsymbol{[2025/08/22]}\)
补全了集合幂级数全家桶模板
如题。
\(\boldsymbol{[2025/08/23],[2025/08/24]}\)
NJUSC
全是傻逼题,这个营没一个是题,过于逆天了。
\(\boldsymbol{[2025/08/25]}\)
ARC185D
首先注意到只有所有叶子是关键的,于是只需要考虑走到所有叶子的期望步数即可。
考虑 \(f_i\) 表示走了 \(i\) 个叶子的期望步数,记 \(C\) 表示根到叶子需要的期望步数。有:
因为走到一个新叶子的概率是 \(\dfrac{n-i+1}{n}\)。
所以 \(f_n=(2nH_n-1)C\),其中 \(H_n=\sum\limits_{1\le k\le n} \frac{1}{k}\),接下来只需求 \(C\)。
考虑此时我们只关心深度,于是可以把树等价抽象为一条 \(m+1\) 个点的链。
接下来套用树上随机游走结论:\(F_i\) 表示 \(i\) 到父亲的期望步数,则 \(F_i=2sz_i-1\),其中 \(sz\) 表示子树和。
于是 \(\sum F_i=\sum\limits_{i=1}^m 2i-1 =m^2\)。
即 \(ans=(2nH_n-1)m^2\),线性逆元做到线性!
ARC184E
感觉每一步自己都见过(很套路),但自己就是不会!
首先前缀和是多个数,不好做,转化成差分。
观察到差分一定成环!于是只需要确定环 代表元,长度。以及每个数在环上的 位置 即可。
然后上那个差分的生成函数:\(\Delta^t a\sim (1-x)^t A\sim (1+x)^t A=\prod\limits_{k\in S_t}(1+x)^{2^k}A=\prod\limits_{k\in S_t}(1+x^{2^k})A\)
其中 \(\sim\) 表示等价,\(S_t\) 表示 \(t\) 的二进制表示。最后一步二项式定理展开,然后 Lucas 定理显然。
环的代表元就选字典序最小的。
具体的,贪心:考虑最低位 \(1\) 在 \(p\),每次判断 \(p+2^k\) 位是 \(0/1\) 即可。
这里复杂度 \(\mathcal{O}(nm\log m)\),因为最多 \(\log m\) 轮修改。
然后环长就是最小的 \(2^k\) 使得 \(p+2^k>m\),这个也显然。
最后找到每个数在环的位置 \(a_i\),对每个环分别求 \(\sum\limits_{1\le j<i\le n} (a_i-a_j)\bmod d\),其中 \(d\) 表示环长。
这东西只需考虑加上多少 \(m\) 即可,用树状数组随便维护一下。
复杂度 \(\mathcal{O}(nm\log m)\)。
qoj 14019
令 \(m=22\),表示 \(\log (2^{22})\)。
偶数性质很关键!
从小到大枚举 \(k\),就等价于找到不同集合 \(|S|=|T|=k\),使得 \(\text{xor}(S)=\text{xor}(T)\),注意 \(S,T\) 允许交!因为交了就不是最小了。
然后直接暴力 dfs 即可,和找环类似。假设做到 \(k\) 这一轮,初始 dfs(0,1,k)。
dfs(s,x,c) 表示当前找了前 \(x-1\) 个,异或和为 \(s\),已经选了 \(c\) 个。
每次枚举下一个选 \(i\ge x\),然后递归 dfs(s^a[i],i+1,c-1) 即可。
由于 dfs 每次 \(c-1\),于是走到 \(c=0\) 用到 \(k\) 次。
由于 \(c=0\) 时,重复走到同一个 \(s\) 值就找到解了!
于是只需 \(k2^m\) 的势能,总复杂度最多 \(\mathcal{O}(m^2 2^m)\),跑得极其不满,随便过。
\(\boldsymbol{[2025/08/26]}\)
ARC184A
\(11\) 个分一组,判断是否全相等,是那么就全是好的。
然后对于剩下的组只需要询问一次,次数 \(920-\epsilon\) 次左右。
\(\boldsymbol{[2025/08/27]}\)
P13856
P11053
板子题,套用 ARC107E 类似结论,发现当 \(i,j\ge 4\) 时,\(a_{i,j}=a_{i-1,j-1}\)。
然后随便前缀和维护一下即可。
\(\boldsymbol{[2025/08/28]}\)
loj 5410
有意思的题目。
前 \(70\) 分就考虑分讨最大值位置,然后只有 \(h_i=k-j,h_j=k-i,h_k=j-i\) 的时候枚举一个数无法确定剩下任何信息。
其他都可以 \(\mathcal{O}(n)\) 算,这个就考虑 \((i-h_i,i+h_i)\) 连边!这类和此图三元环个数双射!
于是 \(\mathcal{O}(n\sqrt n)\) 算一下三元环即可。
后 \(30\) 分就考虑尽量构造三元环,随机 \(B=n^{\alpha}\)。
然后把 \((i-h_i,i+h_i)\) 连边构成的图,尽量连成一个大小为 \(B\) 的完全图,可以少一些边。
随机 \(B\),调调参就能过了,限制不算紧,反正几乎是提答题。
\(\boldsymbol{[2025/08/29]}\)
ARC182D
弱化双倍经验:AGC052E,相当于这题 \(m=3\) 版本。
特判 \(m=2\)。
就是考虑 \(\bmod m\) 太烦了,直接摘掉。
假设最终不 \(\bmod m\) 的状态是 \(a'\),那么要求 \(a'_i\equiv b_i\pmod m,|a'_i-a'_{i+1}|<m\),就考虑取模的加减 \(m\),容易说明这个是充要的。
并且注意到 \(a'\) 的相对大小和 \(a\) 相对大小一致。
先钦定 \(a'_1=b_1\),然后根据 \(a\) 大小构造一组合法 \(a'\),然后考虑 \(a'\) 整体平移 \(km\)。
最终要求 \(\sum |a_i-a'_i-km|\) 最小,取中位数附近即可。
实现得好,用 nth_element 做到线性。
\(\boldsymbol{[2025/09/03]}\)
P12417
神仙构造题,感觉题解说得很清楚了。
P11714
DAG 容斥板子题。\(f(S)\) 表示 \(S\) 强连通方案数。
强连通变成:所有方案减去缩点后 DAG 不止一个点的方案数 \(g(T)\)。
然后 \(g\) 再用 \(f\) DAG 容斥一下。难点在于算 \(E(T\to S\backslash T)\)。
注意到 \(E(T\to S\backslash T)=E(T\cup \{x\}\to S\backslash (T\cup \{x\}))-\text{popcount}(out_x\text{ and }(S\backslash T))+\text{popcount}(in_x\text{ and }T)\)。
于是总复杂度 \(\mathcal{O}(3^n)\)。

浙公网安备 33010602011771号