6 月做题记录
6.2-6.8
P8421 [THUPC 2022 决赛] rsraogps
扫描线,然后发现需要修改的位置和个数不超过 \(O(n\log n)\),而不只是区间个数 \(O(n\log n)\),然后就可以直接 \(O(1)\) 打 tag。
P8331 [ZJOI2022] 简单题
推一下性质,发现每个环形如杏仁形式,然后维护一下就比较简单了,每个点双单独维护,然后建园方树即可。
P8349 [SDOI/SXOI2022] 整数序列
从 critnos 博客发现 \(\sum \min(S_x,S_y)\log {\max (S_x,S_y)}{\min(S_x,S_y)}\) 还是 \(O(Q\sqrt n)\) 的。
P9521 [JOISC 2022] 京都观光
推一下式子,发现横纵两维都只需要维护在凸包上的点即可,然后每次在两个维度上选代价更小的即可。
P7468 [NOI Online 2021 提高组] 愤怒的小 N
似乎有结论:
在 \(0\le p<k\) 时成立,然后可以导出一个 \(O(k^3)\) 的做法。
然后还有一种做法,设 \(p_i=(-1)^{\text{popcount(i)}}\),那么 \(ans=\frac 1 2(\sum_{i=0}^mF(i)+\sum_{i=0}^mp_iF(i))\)。
前者可以直接插值,然后我们考虑后面部分,将 \(2i\) 和 \(2i+1\) 配对,然后我们发现,然后减出来的是一个 \(k-1\) 次多项式,然后可以递归,具体的可以看 这篇题解
P9265 [PA 2022] Chodzenie po linie
很震撼的题目,考虑 $2,3,4,\ldots $ 次不能到达的,发现形如 \(i<u,p_i<p_v\) ,然后我们可以按 \((u,v)\) 建成一棵树,的情况,然后可以证明这样的 \((u,v)\) 对只有 \(O(n\sqrt n)\) 对,然后就可以用 \(O(\sqrt n)-O(1)\) 的分块计算。
然后去重不能用哈希表,会被卡常,需要利用单调性从右往左扫描。
P3822 [NOI2017] 整数
考虑没有减法我们有一个均摊,然后有减法我们分开维护减法和加法,然后询问我们需要比较后缀,维护不同的位有哪些即可,这样 set 维护是两个 log,发现修改差不多是一个区间形式,按 log 先分次块然后 set 维护即可。
CF388D Fox and Perfect Sets
考虑填标准基,然后所有数的和 xor 就是最大值,我们需要其 \(\le k\),数位 dp 即可。
CF1603F October 18, 2017
CF671E Organizing a Race
有个很魔怔的做法是考虑推导 \(pre',suf',cost\) 之类的关系,然后一路推导得到一个单侧递归做法。
还有一种做法是对于每个点推导从起始位置到这个点的修改对于从右往左的影响,然后推一下式子发现是一个三维偏序,分治求解 \(O(n\log^3 n)\),看起来后面这个比较容易想到。
[ARC139F] Many Xor Optimization Problems
[ARC158F] Random Radix Sort
挺套路的。
发现操作只有本质不同的 \(k\) 个,考虑计算 \(k\) 个操作的方案数,乘上第二类斯特林数即可,考虑找到每个 B 对应的 A,考虑相邻两个 B 之间的,发现存在一个集合 \(S\) 和一个集合 \(T\),满足 \(T\) 中最后一个在 \(S\) 最后一个后面出现,然后就可以状压 dp 了。
还有一种特殊情况是 \(S\) 不出现,但是 \(p_i>p_{i+1}\),这种情况 \(T\) 必须出现至少一个数,注意判断。
6.9-6.19
写不动题,来写这个。
P10042 [CCPC 2023 北京市赛] 三染色
首先如果我们没有 \(\bmod 3\) 限制怎么做,那么我们就找到全局最小值,往 \((1,1)\) 扩散就知道时间了。
然后现在有 \(\bmod 3\),我们发现形如 \((1,1),(2,3)\) 的是无解的,然后我们考虑有解的时候怎么做。
我们考虑构造一个序列 \(h\),满足 \(h_{i,j}\equiv a_{i,j}(\bmod 3)\),且相邻的 \(h\) 差绝对值 \(\le 1\),那么这样的 \(h\) 在 \(a_{1,1}\) 确定的情况下是唯一的。
然后我们只需要 dp 最小值和最小值到 \((1,1)\) 的距离即可,可以简单记录一下。
P5294 [HNOI2019] 序列
似乎是保序回归经典题,在序列上直接贪心维护凸壳即可。
P5404 [CTS2019] 重复
先补集转化一下,考虑建出 KMP 自动机,那么我们每次转移,需要大于等于这个节点到路径上所有点的转移边,设 \(P(S)\) 表示 \(S\) 在自动机上匹配到的节点,然后考虑 \(T^{\infty}\) 在自动机上的匹配到的节点,我们知道 \(P(T^{\infty}+T)=P(T^{\infty})\),所以我们枚举这个节点 \(u\) 然后直接对于 \(T\) 经过路径 dp 可以做到 \(O(n^2m)\),但是我们发现,如果我们大于转移边,会直接转移到 \(0\),等于转移边,我们只有一种转移,所以如果我们预处理出从 \(0\) 开始,走若干条边到达 \(u\) 的路径数量即可,复杂度 \(O(nm)\)。
P7211 [JOISC 2020] カメレオンの恋
如果我们 \(O(n^2)\) 两两询问,如果答案为 \(1\) 就连边,那么每个点度数为 \(1\) 或者 \(3\),度数为 \(1\) 的时候,所连的点就是颜色相同的点,度数为 \(3\) 的时候,我们可以通过两次询问得到颜色相同的那个点,那么现在问题变成了如何把这个图建出来。
然后一个很厉害的做法是考虑利用点度数 \(\le 3\) 的性质,每次在点集里面找一个极大的独立集,然后不在点集内的二分在该独立集内找连边,然后递归下去,由于我们的度数 \(\le 3\),所以每次点集大小最多是原来的 \(\frac 3 4\),这样只有 \(O(\log n)\) 轮,然后结束了。
P9334 [JOISC 2023] Mizuyokan 2 (Day2)
也是很厉害的题目,首先考虑我们调整使得可以让在低处的部分永远只有 \(1\) 个,而峰只需要满足 \(\sum_{i=l}^ra_i>\max(a_{l-1},a_{r+1})\) 即可,然后我们就可以考虑,设 \(f_i\) 表示以 \(i\) 为右端点,最小的左端点,而 \(g_i\) 表示最小的 \(j\),使得 \(f_j\ge i+2\),这样就变成了不断跳 \(g_i\) 的问题,可以弹飞绵羊解决。
对于修改发现 \(f_i-i=O(\log V)\),所以一次只修改 \(O(\log n)\) 个连续位置,还是弹飞绵羊直接维护。
更香的做法是发现一步只跳 \(O(\log V)\),所以可以线段树维护一个大小为 \(O(\log V)\) 的函数,修改的时候是 \(O(\log V)\) 个连续位置,可以做到 \(O(n\log^2 V)\)。
P12445 [COTS 2025] 数好图 / Promet
比较牛的题目,考虑把点分成四种:
- \(1\to x\to n\) 。
- \(1\not\to x\to n\)
- \(1\to x\not\to n\)
- \(1\not\to x\not\to n\)
然后你发现,我们先按 \(1,2\) 和 \(3,4\) 类分成一,二类,然后只有一类能往一类连边,但是一二类都可以往二类连边,那么我们先不看一类内部的贡献,先 dp 出来 \(h_{i,j}\) 表示有 \(i\) 个点,\(j\) 个一类点时的方案数。
然后我们考虑一类点内部连边,分成 \(1,2\) 类,发现转过来后转移几乎是相同的!
那么我们只需要考虑 \(1\) 类点内部的边即可,考虑怎么计算这个部分,我们发现每个点都满足 \(1\to x\to n\) 的条件是每个点都有入度和出度,\(1,n\) 特殊一些。
然后我们可以从前往后 dp,有入度是好计算的,有出度不好计算,考虑直接容斥一下即可,然后我们就是 \(\sum_{i=0}^n val_i\binom n i=[n=1]\),反演得到 \(val_i=(-1)^{n+1}n\),然后做完了。
P11420 [清华集训 2024] 乘积的期望
很厉害的题。
我们首先考虑暴力怎么做,考虑组合意义,即每个点选择一个操作,那么实际上我们有用的操作数量只有 \(O(n)\),假设我们选择了 \(x\) 个操作,那么最后乘上 \(S^{\underline x}\times (\sum b)^{C-x}\) 即可。
然后我们考虑怎么去 dp,首先我们发现,如果我们的 \(p_1,p_2,\ldots p_k\) 都选择了同一个操作,那么这个操作的选择数量只跟 \(p_1,p_k\) 有关,然后我们就可以直接 dp 了,设 \(f_{i,j,S}\) 表示考虑了前 \(i\) 个数,选择了 \(j\) 个操作,目前还有 S 内的点可以作为 \(p_1\) 的方案数,然后转移就考虑同时作为 \(p_1,p_k\),只作为 \(p_1\) 或者 \(p_k\),或者都不作为,复杂度 \(O(2^{m}n^2m)\)。
发现 \(2m>n\) 的时候,中间有 \(2m-n\) 个数每次都被覆盖,所以可以抛去,那么此时 \(m'=n-m,n'=2n-2m\)。
平衡一下我们就有 \(O(2^{n/2}n^2m)\) 做法,但是无法通过。
此时我们还可以发现,答案是一个关于 \(C\) 的 \(O(n)\) 次多项式。
不知道为什么,能发现此时 \(m\) 如果 \(>=\frac n 3\) 的话此时我们可以拆成 \(a_i,a_{i+m},a_{i+2m},i\in[1,m]\) 三个部分,那么我们满足
\(a_i+a_{i+m}+a_{i+2m}=C,a_{i}\le a_{i+1},a_{i+2m}\ge a_{i+2m+1}\)。
那么我们就可以 dp 了,枚举 \(a_{2m+1}\),然后 dp,设 \(f_{i,x,y}\) 表示考虑到了 \(a_{i}=x,a_{i+2*m}=y\),然后考虑逐步转移,即可对于 \(v\in[1,n+1]\),计算出 \(C=v\) 的答案,然后插值即可,复杂度 \(O(n^6)\)。
[ABC215H] Cabbage Master
第一问显然霍尔定理 + FWT。
第二问考虑枚举拿的集合 \(S\),然后发现不一定能覆盖完,再容斥一遍,简单计数。
[ABC397G] Maximize Distance
一个做法是二分后线性规划对偶,然后跑费用流。
另外一个做法是二分,建立分层图,设 \(d_{x,i}=[dis(i)>=x]\),然后跑最小割。
QOJ3082. Ascending Matrix
考虑画出 \(k-1\) 条分割线,每条从 \((n,0)\) 到 \((0,m)\),但是现在是不交错,不是不交,所以我们每条线起点终点往右和下平移 \(i\),那么变成了 \((x',y')\) 的左上角需要有 \(v-1\) 条线,这个可以每条路径经过上面的部分带个 \(y\),然后求 \([y^{v-1}]\),至于如何计算出经过上方的方案数,枚举和哪个 \((x'-i,y'-i)\) 相交,然后计算即可。
暴力计算行列式是 \(O(k^4)\),使用特征多项式优化可以做到 \(O(k^3)\)。
QOJ11117 Under the Epilogue
这个题,有点魔怔。
首先如何判断一个图能否变成 SCC,不断合并两个互相可以到达的连通块。
然后这个题我们考虑维护一种区间 dp 的合并方式,使得每个只被计算一遍即可。
还有一种做法是也是区间 dp,不过是容斥,发现每个点集内的 SCC 是一段区间,然后我们记录每个区间能到达的的最左最后,然后用类似 DAG 容斥的方法即可。
CF441E Valera and Number
从后往前考虑,然后每次 \(+1\) 就是转移到 \(j+1\),否则如果 \(j\) 是偶数,转移到 \(j/2\),否则直接贡献到答案里,然后利用期望线性性拆一拆即可。
CF1158E Strange device
被人类智慧吓晕。
首先考虑确定每个数的深度,如果我们每次将 \(d_1\gets i\),那么我们可以 \(O(n)\) 次内得到深度,考虑优化。
我们可以深度分治,对于 \([l,r]\) 假设我们知道 \(l\) 和 \(r\) 内有哪些点,那么我们可以对于 \(l\) 内的点 \(x\),令其 \(d_x\) 为 \(mid-l\) 和 \(mid-l+1\),这样我们就可以知道深度为 \(mid\) 的点有哪些了,然后我们需要将剩下的点分到 \((l,mid)\) 或者 \((mid,r)\) 内,一个想法是还是令 \(d_x\) 为 \(mid-l\),但是这样我们发现会影响到 \([l-mid+1,l)\) 的点,那么我们直接对于每个区间分成 \((l,mid)\) 和 \((mid,r)\) 分开做即可,因为我们是二分,所以不会影响到其他区间。
这部分是 \(4\log n\) 的。
然后我们考虑确定父亲,考虑对于 \(d+1\) 层的父亲来自哪里,我们拆二进制位,如果 \(x\) 第 \(k\) 位为 \(1\),那么我们令其 \(d\) 等于 \(1\),然后询问的时候如果这个点被覆盖,说明其父亲这一位是 \(1\)。
然后一次修改影响相邻两层,所以做 \(3\) 遍即可,这一部分 \(3\log n\)。
总次数是 \(7\log n\) 的。
CF1336E2 Chiori and Doll Picking (hard version)
魔怔的正交线性基题目,首先设 \(A\) 是序列 \(a\) 组成的线性基,那么我们有一个 \(O(2^{\text{rank}(A)})\) 的做法,设 \(K=\text{rank(A)}\)。
首先设 \(F(S)=\sum_{x\in \text{span(S)}}z^x\)。
那么对于一个 \(x\in span(A)\),\(z^x\ast F(A)=F(A)\)。
所以 \(F(A)\ast F(A)=F(A)\times 2^{K},FWT(F(A))\times FWT(F(A))=FWT(F(A))\times 2^{K},\)。
所以我们得到 \([z^i]FWT(F(A))\in {0,2^{K}}\)
回想一下 FWT 过程,\(\hat f_S=\sum (-1)^{|S\cap T|}f_T\),由于我们是 \(2^K\) 需要满足对于所有的贡献都是 \(1\),这正是正交线性基的定义。
所以我们发现,构成 \(2^K\) 的集合一定是 A 的正交线性基张成的空间,所以我们就可以知道 \(B\times 2^K=FWT(A)\rightarrow IFWT(B\times 2^K)=A\)
然后我们考虑如何计算答案。
然后 \([z^0]IFWT(X)=2^{-m}\sum_S X_S\)
所以我们 \(2^{m-K}\) 枚举 \(B\) 张成空间内的所有数,然后枚举 \(G_c\) 中 \(|S\cup T|\) 是多少,然后组合数计算即可。
CF1770F Koxia and Sequence
首先,每个数的贡献都是一个定量,不妨记作 \(t\),那么偶数的时候全部抵消,此时答案为 \(0\)。
否则我们考虑拆位,计算 \(a_1\) 第 \(i\) 位为 \(1\) 的在模 \(2\) 下的方案数。
然后 \(y\) 的限制就是,某些位置不能有值,某些位置一定要有值。
我们考虑容斥,钦定某些位置不能有值,然后反演,则我们相当于枚举 \(y\) 子集 \(y'\) 必须有值,我们先让 \(a_1\) 和 \(x\) 都减去 \(2^i\),则我们需要计算:
然后逆用 Lucas 定理,变成
然后范德蒙德卷积变成 \(\binom {ny'-2^i}{x-2^i}=[(x-2^i)\subseteq (ny'-2^i)]\)。
然后可以 \(O(y\log y)\) 计算。
6.20-6.29
P8978 「DTOI-4」中位数
首先二分,然后转化成为 \(-1,1\) 序列的问题。
设第 \(x\) 次操作的区间是 \(I_x\),那么我们推一下性质:
- 每次操作的时候,区间的和 \(=1\)。
- 如果存在一种方法,那么操作次数不超过 \(O(\log n)\)。
- 任意两个区间包含。
前面两者显然,最后一个结论可以先证明不存在相交但是不包含的区间,然后可以使用调整法证明结论。
然后我们就可以 dp,换维,再多次利用单调性,就可以做到 \(O(n\log n)\) 完成一次 dp。
P12506 「ROI 2025 Day2」沼泽里的青蛙
经典平面分块,考虑一个块内存在 \(\ge 3\) 个点一定合法,所以只有块内点数 \(\le 2\) 的块会向外界连边,然后没了。
P12504 「ROI 2025 Day1」树上的青蛙
简单题,经典匹配留到最后再做,但是细节很多,需要用一个堆维护什么时候是匹配的最后时候。
pjudge 21809 【PR #12】划分序列
经典扫描线后 mex 只有 \(O(n)\) 段,然后分成若干段完整 mex 区间和一个 mex 后缀,李超线段树分开维护即可。
AT_agc007_e [AGC007E] Shik and Travel
二分一下,然后设 \(f(x,a,b)\) 表示 \(x\) 子树内是否存在一条到一个叶子为 \(a\),出去为 \(b\),且走完所有叶子的路径,然后这个可以把偏序的状态删掉,这样状态数是 \(O(n\log n)\) 的,合并的时候可以双指针,然后就可以做到 \(O(n\log^2 n)\).
AT_agc013_f [AGC013F] Two Faced Cards
这个首先我们可以套一下霍尔定理,将 \(C\) 排序,先不考虑新加入的数的时候,假设一开始我们都选择 \(A\),然后我们等价于有一个序列和若干区间,要选择最少的区间使得这些区间 \(+1\) 后所有数 \(\ge 0\),这个是经典贪心。
然后我们考虑加入一个二元组,我们看作一个后缀 \(+1\) 操作,那么此时我们相当于需要一个前缀 \(\ge 0\),剩下 \(\ge -1\),这个也是可以贪心的,我们考虑先完成所有 \(\ge -1\) 的限制,然后从前往后,把每个为 \(-1\) 的地方贪心变成 \(0\) 即可,看起来正确性挺对的。
下面的题目都是口胡,没有代码,可能有问题
P10656 [ROI 2017] 学习轨迹 (Day 2)
发现一个性质是每个序列的带权中点一定被取到,然后扫描线一下并拆下式子,线段树维护。
CF1924F Anti-Proxy Attendance
不知道哪里来的魔怔题,考虑每个位置分别为 \(00/01/10/11\) 几种情况,然后如果出现 \(000\) 或者 \(111\) 就排除。
震撼的一点是你给 \(0,1\) 分别赋势能,由于次数是 \(O(\log)\),所以考虑分别令势能为 \(1,x\) 即可。
然后我们列出变化规律:

由于我们需要尽量最坏情况下势能尽量小,所以令 \(x=\frac {1+\sqrt 5} 2\) 即可。
然后我们需要 \(\max(E_0,E_1)\) 也尽量少,这样我们每次会变成原来的 \(\frac x 2\) 倍,这样算一下发现询问次数是很够的。
然后我们考虑怎么令势能变成原来的 \(\frac x 2\) 倍,我们对于每个前缀计算 \(E_1-E_0\) 的差值,找到最接近 \(0\) 的地方即可。

浙公网安备 33010602011771号