「September」做题笔记

CF685C Optimal Point

直接二分答案。我们试图夹逼出一个范围。和那个什么题一样。

image

可以得出 \(x+y+z,-x+y+z,x-y+z,x+y-z\) 的范围。

仿照二维情况将曼哈顿距离转化成切比雪夫距离的方式。我们令 \(u=-x+y+z,v=x-y+z,w=x+y-z\)。则有 \(x=\frac {v+w} {2}\)\(y=\frac {u+w} {2}\)\(z=\frac {u+v} {2}\)\(x+y+z=u+v+w\)

所以我们得到了 \(x,y,z,x+y+z\) 的范围。

check 的时候先贪心将 \(x,y,z\) 取到最大值,再贪心放大即可。

实现的时候需要注意 \(x,y,z,x+y+z\) 必须同奇偶,并且这四个数的范围要先判断。


CF1854B Earn or Unlock

可以列出一个二维 dp,但是好像优化不了。

你感受一下,这个值就等于扩展的个数,这个条件很重要。

发现如果我们扩展了 \(k\) 个数,那么答案就等于 \(\sum_{i=1}^k-k+1\),其中 \(k<2n\)

直接 bitset 优化即可。


CF1854C Expected Destruction

如果两个数不会撞在一起,答案就是 \(\sum m-a_i+1\)

由于撞在一起的数只能是相邻的,而且这两个数相同就停止撞的过程,并且不影响其他数对。

所以根据期望的线性性质,考虑相邻两队即可。设 \(dp(i,j)\) 为两个数为 \(i\)\(j\) 的概率,这个可以 \(\mathcal {O}(n^2)\) 转移。答案减去 \(\sum dp(i,i)*(k-i+1)\)

然后你发现多个数对可以用一个 dp 处理,所以总复杂度也是 \(\mathcal {O}(n^2)\)


CF1854E Game Bundles

一点思路都没有。正解是随机化。

考虑 \(a_i>30\) 只会被选一次,我们随机一下 \(a_i\leqslant 30\) 的数,直到再加一个数 \(dp_{60}\) 超过 \(k\)

贪心选取 \(dp_0\sim dp_{29}\) 中最大的数,至少总方案 \(\geqslant m\)

由于 \(m\) 可能很大,我们刚开始随机的上界不能是 \(30\),而是 \(random(1,30)\)

证明不会,感受一下可以感觉到 \(dp\) 是一个比值趋近于 \(2\) 的等比数列,这个可以归纳地感受。


[AGC023C] Painting Machines

原来 \(n\) 这个位置不能选。(

考虑如何翻译出这个 “染黑所有格子”。可以化简一下答案等于 \((n-1)!+\sum_{i=1}^{n-1}(n-1)!-第 i 步已结束的方案数\)。这个已结束可以翻译成 \(S_1=1,S_i=n-1\)\(S_i-S_{i-1}\leqslant 2\)。考察其中的空隙 \(\in [0,1]\)。所以可以转化成一个 \(\sum_{j=1}^{i-1} x_j=n-i-1\)\(x_j \in [0,1]\) 的方案数,答案为 \(\binom {i-1} {n-i-1}\)

答案为 \((n-1)!+\sum_{i=1}^{n-1} (n-1)!-i!\binom {i-1} {n-i-1}\)

上面那个不对,选了 \(i\) 个,剩下的 \(n-1-i\) 个也会提供 \((n-1-i)!\) 的贡献。

所以答案为 \((n-1)!+\sum_{i=1}^{n-1} (n-1)!-i!(n-1-i)!\binom {i-1} {n-i-1}\)


[国家集训队] 整数的lqp拆分

斐波那契的生成函数是 \(f(x)=\frac {x} {-x^2-x+1}\)。而 \(\sum{f^i(x)}=\frac {1} {1-f(x)}=\frac {x^2+x-1} {x^2+2x-1}=1-\frac {x} {x^2+2x-1}\)

将右边的式子化简为 \(x(\frac {A} {1+Bx}+\frac {C} {1+Dx})\) 的情况。\(\frac {1} {x^2+2x-1}=(\frac {1} {x+1-\sqrt 2}-\frac {1} {x+1+\sqrt 2})*\frac {1} {2\sqrt 2}\)

由于 \(\frac {1} {1-(ax)^k}=\sum_{i=0}^{+\infty} (ax)^{ik}\)

所以答案就是 \(\frac {\sqrt 2} {4}((\sqrt 2 + 1) ^ k - (1 - \sqrt 2) ^ k)\),中间的过程懒得写了。


[HAOI2018] 染色

容斥。\(f(s)=\sum_{i=s}^{\min(m,n/S)}(-1)^{i-s}\binom i s \binom m im^{n-Si} \frac {n!} {(n-Si)!(S!)^i}\)。(注意 \(\binom i s\) 不要乘掉了,可以用二项式反演理解)

暴力卷积 \(n^2\)

右边那一坨有个 \(n-Si\) 不太好优化,令 \(F(i)=\binom m i m^{n-Si} \frac {n!} {(n-Si)!(S!)^i}\)。然后剩下的就是一个卷积,翻转一个数组后 NTT 即可。


CF1863F Divide, XOR, and Conquer

有小丑把 xor 看成或了。可想那一场我是多想睡觉。这个题最多 1800 分吧。🤡

考虑一段区间的异或和,起决定性因素的肯定是最高位。

对于左端点是 \(l\) 或者右端点是 \(r\) 的区间,如果包含这个位就合法。

用区间dp的顺序给一个点打一个两元标记即可。


[AGC023E] Inversions

咕咕咕。


[AGC023F] 01 on Tree

非常难崩,刚好是今天模拟赛 T1 的 trick,那个题我没切掉。(

如果没有依赖按照 \(num0/num1\) 从大到小排序即可。

有依赖会出现可能当前这个点不应该选,但是加上子树会选,所以我们不妨从叶子开始考虑。

我们将 \(num0/num1\) 从大到小排序丢进一个优先队列里面,取出堆顶。两种情况,如果这个点没有依赖,直接选就好了,否则要与父亲的连通块合并,这个可以 DSU 维护。

事实上也并不需要大众说的可删堆/set,直接判断这个点和父亲是否在一个连通块里面即可。因为选的是 \(num0/num1\) 最大的,新加入的元素的这个值一定大于原来的值。

这个题不好说,建议看代码,很好懂的。https://atcoder.jp/contests/agc023/submissions/45265741


[AGC024D] Isomorphism Freak

容易想到答案下界是 \(\lceil \frac D 2 \rceil\),其中 \(D\) 为直径长度。

手玩一下发现同构的充要条件是以中心为根,每个深度相等的点的度数相等,所以答案就是 \(\prod s_i\),其中 \(s_i\) 为深度为 \(i\) 节点的最大儿子数。

由于可以增加节点,一个点或者一条边都可以成为中心,所以枚举一下再计算,时间复杂度 \(\mathcal{O}(n^2)\)\(n\leqslant 100\) 应该是使答案在 \(\mathrm{long\ long}\) 中。


「2019 集训队互测 Day 5」国际象棋

这种 trick 都被出烂了,大家一起复古。

观察这个方程,可以得到最远处的 \((x+2,y+1)\)

由此我们设置前两行和第一列作为主元,根据这个方程直接递推得到系数。

然后最下面两行和最右边一列可以作为方程,所以 \(2m+n-2\) 个主元和方程,直接高斯消元即可。查询的时候代入即可。


[COCI2018-2019#4] Akvizna

wqs 板,精度要开 \(10^{-14}\)


[IOI2014] holiday 假期

注意到答案的形式是先往左边走,再掉头走右边的情况,另一种可以翻转做。

右端点向右移的时候,左端点一定不会向左移。直接决策单调性就好了。


CF407E k-d-sequence

当时好像是 Freopen(?)给新大一(?)讲过这个题,当时为什么我没听懂?

先对 \(d\) 取模,把模数相同的一段数拿出来处理。

问题转化为求一个最长的区间满足 \(\max-\min-r+l\leqslant k\)

可以维护出一个以 \(l\) 代表的答案序列,而 \(\max\)\(\min\) 可以用单调栈转化成区间加减操作。

所以线段树找出区间左边第一个小于等于某个数的位置即可。

注意答案区间不能越过两个相等的数,并且 \(d=0\) 要特判。


「BZOJ3963 WF2011」MachineWorks

按机器出现时间从小到大排序。

\(dp_{i}=dp_{j}+R_j-P_i+G_j(D_i-D_j-1)\)。直接李超树即可。


[NOI2011] NOI 嘉年华

🤡。

\(f(i,j)\) 为前 \(i\) 个离散化后的数选了 \(j\) 个会场 \(1\),会场 \(2\) 最多有多少区间。

选择会场 \(1\)\(f(i,j)=\max_{k=0}^{i-1}f(k,j-val(k+1,i))\),其中 \(val(i,j)\) 为完全包含于 \([i,j]\) 的区间数量,可以通过 sos dp 的思想 \(\mathcal O(n^2)\) 处理。

选择会场 \(2\)\(f(i,j)=\max_{k=0}^{i-1}f(k,j)+val(k+1,i)\)

答案就是 \(\max_{i=1}^{tot}\max_{j=0}^n\min(f(i,j),j)\)。所以第一问可以以 \(\mathcal O(n^3)\) 的时间通过。

上面那个dp的设置和转移复杂度已经卡满,故第二问不能再枚举。

\(g(i,j)\)\([i,n]\) 的数选了 \(j\) 个会场 \(1\),会场 \(2\) 最多有多少区间。

\(ans=\max_{l=1}^{L[now]}\max_{r=R[now]}^{tot} \max_{u=0}^n \max_{v=0}^n \max(\min(u+v+val(l,r),f(l-1,u)+f(r+1,v), \min(u+v,f(l-1,u)+f(r+1,v)+val(l,r))))\)

这是个卷积形式,可以设 \(p(l,r)=\max_{u=0}^n \max_{v=0}^n \max(\min(u+v+val(l,r),f(l-1,u)+f(r+1,v), \min(u+v,f(l-1,u)+f(r+1,v)+val(l,r))))\),似乎形式很优美。

然后你发现 \(u\) 增加,\(v\) 就会减少,直接处理即可。这里不仅有决策单调性,因为式子的特殊形式,值域也是单调性,所以直接移动双指针即可。

时间复杂度:\(\mathcal O(n^3)\)


[AGC024E] Sequence Growing Hard

p.s. 洛谷上对于这个做法(\(n^3\) 状态)的题解都在乱讲,或者说都没说清楚。😓

这个题完全评得上 *3000。

可以转化成构造 \(A_n\) 再确定顺序。

可以看成一个插入 dp,时间复杂度大概是 \(\mathcal {O}(n^3)\) 的。

请注意,本题求的是 本质不同序列的个数 而不是 插入的方案数。如果存在相同的连续段,插入第一个数的时候肯定要 \(a_{nxt}<a_{now}\),我们钦定从左到右插入,字典序增大就转化为了后面的数小于当前数或者加入到当前序列的末尾。

我们考虑从小到大插入数字,令 \(dp_{i,j,k}\) 为插入 \(i\) 个数,考虑到 \(j\),现在的插入指针在第 \(k\) 处的方案数。请注意 插入的顺序并不对应 \(S_i\) 的顺序,我们只是在构造答案序列。

\(dp_{i,j,k}=dp_{i-1,j,k}\times (k+1)\)。这个 \(k+1\) 并不是指插入到具体的那个位置,而是一个表示 \(S_i\) 插入顺序的系数。插入的位置一直都是 \(k\)

\(dp_{i,j,i}=dp_{i,j-1,0}\)

\(dp_{i,j,k}=dp_{i,j,k+1}\)

即可。


彩树

斯坦纳树

思想是按照状态作为dp的顺序,我本应该要意识到这一点的。令 \(g_{S,i}\) 为根度数为 \(1\),颜色集合为 \(S\) 的方案数,\(f_{S,i}\) 为颜色集合为 \(S\),的方案数,枚举子集转移即可。事实上这个 dp 的设置可以先思考一下暴力的转移 \(dp_{i,s}=\sum_{j}\bigcup_{u\bigcap s=u}dp_{j,u}\),然后你发现 \(f\) 只是个辅助数组。


[AGC024F] Simple Subsequence Problem

考虑我们判断是不是子序列的过程,对于匹配串 \(S\),若 \(S_1=x\),则找到模式串中 \(T_i=x\) 的最小 \(i\),然后删除 \(S_1,T_{[1,i]}\)

\(f_{S,T}\) 为当前的匹配串为 \(S\),模式字符串还剩下 \(T\) 的字符串个数。那么答案就是 \(f_{S,\empty}\geqslant k\) 的最长字典序最小 \(S\)。初始值就是 \(f_{\empty,T_i}=1\)

发现 \(|S|+|T|\leqslant n\),所以实际上状态数只有 \(2^n n\) 个。

直接 dp 就好了。具体实现有点细节。


「2020-2021 集训队作业」Communication Network

喵喵题。

\(ans=\sum_{T2}|T1\bigcap T2|2^{|T1\bigcap T2|}\)

这个严格交不好整啊,直接子集反演。子集反演就是 \(f(S)=\sum_{T\subset S|S\subset T}g(T)\Rightarrow g(S)=\sum_{T\subset S|S\subset T}(-1)^{|S|-|T|}f(T)\)\(ans=\sum_{T2} \sum_{S\subset T1 \bigcap T2}\sum_{T\subset S}(-1)^{|S|-|T|}|T|2^{|T|}\)。这个式子相当于反演再反演。等我实力精进再来用组合意义证明。

\(ans=\sum_{S\subset T1}f_S\sum_{T\subset S}(-1)^{|S|-|T|}|T|2^{|T|}=\sum_{S\subset T1}f_S \sum_{i=1}^{|S|} (-1)^{|S|-i} \binom {|S|} {i} i 2^i=\sum_{S\subset T1}f_S \sum_{i=1}^{|S|} (-1)^{|S|-i} \binom {|S|-1} {i-1} S 2^i=\sum_{S\subset T1}f_S |S|2\sum_{i=1}^{|S|} (-1)^{|S|-i} \binom {|S|-1} {i-1} 2^{i-1}=-\sum_{S\subset T1}(-1)^{|S|}f_S |S|2\sum_{i=1}^{|S|} \binom {|S|-1} {i-1} {(-2)}^{i-1}=2\sum_{S\subset T1}f_S|S|\),其中 \(f_S\) 表示包含边集 \(S\) 的生成树个数。

prufer 序列的经典结论,所以 \(ans=\frac {2} {n^2}\sum_{S\subset T1}|S|\prod na_i\),其中 \(a_i\) 表示各个连通块的点数。用组合意义统计这个式子,即在边集中选一条边,再每个连通块中选一个点,每个点提供 \(n\) 的贡献,所以令 \(dp_{x,u,v}\) 表示以 \(x\) 为根,\(x\) 所在的连通块是否选点,\(x\) 子树内有没选边的方案数。

直接 dp 即可。时间复杂度 \(\mathcal O (n)\)。其实实现不难的。


[ABC240Ex] Sequence of Substrings

一个重要的观察是 \(|s_i|-|s_{i-1}|\leqslant 1\),所以 \(|s_i|\leqslant \sqrt {2n}\)

直接把这个字符串提出来排序,再树状数组优化 dp 即可。

时间复杂度 \(\mathcal {O}(n\sqrt n \log)\)


[ABC219H] Candles

自然想到按横坐标排序后对区间考虑,但是如果 dp 记录最长长度和,我们并不知道现在的时间。

考虑 费用提前计算。记 \(dp_{i,j,k,0/1}\) 为当前在 \([L,R]\) 的左/右端点,区间外还有 \(k\) 个数不会被消成 \(0\) 的最大长度和。

转移就是枚举当前是否被消成 \(0\)。发现 \(k\) 如果偏大了答案只会更小,所以这个流程是对的。

时间复杂度:\(\mathcal O (n^3)\)


[ABC252Ex] K-th beautiful Necklace

因为相同的数可以算两次所以线性基不行。

范围非常搜索,直接折半搜索,在外面套一个二分,然后 trie 查找即可。

发现复杂度最高在把 \(35\) 拆分成 \(k_12+k_23\) 的形式。最大为 \(354294\),所以时间复杂度是 \(\mathcal O (354294\times 60^2)\)

二分太冗了。直接填答案,把所有状态对应的 trie 节点同时考虑,判断同向节点和是否足够,足够就填 \(0\),否则填 \(1\) 即可。时间复杂度优化成 \(\mathcal O (354294\times 60)\)

上面那个有点问题,如果一个颜色同时在两边,这个数提供的贡献不是出现次数而是出现次数加 \(1\),所以我们贪心将一个颜色对应的所有数放入少的那边即可。上界要开大一些。


[AGC040E] Prefix Suffix Addition

如果只有操作 \(1\),答案就是极长不下降子序列的个数。


「2019 集训队互测 Day 3」操作序列计数

统计 \(i\in [0,up]\)\(\{c_0,c_1,c_2,...,c_i\}\) 的个数,其中 \(\sum c_j k^j\leqslant n\)\(c_i \geqslant 1\)

\(n\) 表示成 \(k\) 进制形式,考虑从低到高 dp。

把 dp 式子写出来,发现是个关于 \(j\) 的多项式,维护点值插值即可。

等能力提升来写代码。


[AGC061C] First Come First Serve

最直观的答案是 \(2^n\),考虑不合法的情况是一个数选了 \(a,b\) 排名没有变化。

考虑上面那个的充要条件,由于 \(\{a\},\{b\}\) 单调,找到最左边的 \(b_{L_i}\geqslant a_u\),最右边的 \(a_{R_i}<b_i\)。发现 \([L_i,i-1]\) 必须都取 \(a\)\([i+1,R_i]\) 必须都取 \(b\)

发现如果多个数不合法,它们的 \([L_i,R_i]\) 一定不交。考虑容斥 dp,\(dp_i\) 为考虑前 \(i\) 个数的答案。\(dp_i=\sum_{R_j=i}-\frac {dp_{L_j-1}}{2^{R_j-L_j+1}}\)\(dp_0=2^n\)

注意乘的系数是 \(\frac {1}{2^{R_j-L_j+1}}\) 而不是 \(\frac {1}{2^{R_j-L_j}}\),因为容斥是枚举的不合法的集合,而这个数本身就是要乘 \(\frac 1 2\)


CF303E Random Ranking

感觉这个题很套路。

可以想到一个 naive 的 dp,枚举这个点所以的段,统计点对,背包做到 \(\mathcal {O} (n^5)\)。(注意是要统计小于这个段的和在这个段里的,而不能直接计算,因为那样的话会有不同的取值贡献了一种方案)

重复计算了很多,可以左右都跑一遍前缀和,再二维 FFT,时间复杂度 \(\mathcal {O}(n^4\log^2 n)\)

好像不能退背包,考虑对序列二分,直接 cdq 那样,具体我不想写了,时间复杂度 \(\mathcal O (n^4 \log_2 n)\)


Magic

我觉得这个题不简单啊。

考虑两个点对在第二个区间的端点处产生贡献。发现一个区间能产生贡献的只有 \(L_i,R_i\)

两个区间有交且大于等于 \(2\),那么两个区间的端点不能同时产生贡献。

答案即为 \(2n-\) 最大独立集。因为左右端点不同所以是二分图。

bitset 优化匈牙利做到 \(\mathcal O(\frac {n^3} {w})\)


[AGC040E] Prefix Suffix Addition

喵喵题。

首先可以写出暴力 \(dp_{i,j}=\min(dp_{i,j},dp_{i-1,k}+[j<k]+[j<k+a_i-a_{i-1}])\)

观察一下,发现 \(j\) 越大,\(dp\) 值越小,且 \(\delta \leqslant 2\)

这提醒我们维护两个分界点和最小的 dp 值。

就这样,可以把式子写出来推转移,这里略去了,因为我也没怎么搞清楚。

当然更容易的实现方式是二分出下一个分界点。


Lost Array

这个题有很多做法。

首先可以观察到

其中一个做法是观察图形,发现我们可以把最上面一行转到副对角线,再转到最下面一行。

这个题咕了,我到时候再来写。


「JOISC 2014 Day1」巴士走读

【这个题待补】

如果只有一组询问,我们二分,跑最短路即可。

复杂度瓶颈在每次冗余地跑最短路,所以整体二分即可。

时间复杂度 \(\mathcal O (n\log_2 n\log_2 V)\)


「JOISC 2014 Day1」拉面比较

两两分组,比较一次出最小值和最大值。然后最小值和最大值互相比较即可。

次数是 \(\frac 3 2 n\) 次。


「JOISC 2014 Day2」水壶

建出 kruskal 重构树找 lca 即可。问题在于怎么建出这棵树。

发现我们 bfs 即可。


[AGC010E] Rearranging

首先可以证明如果我们确定了顺序,这个过程是没有后效性的。

但是有问题,换一个角度,如果 \(i\)\(j\) 前面且 \(\gcd(i,j)>1\),将 \(i\) 联向 \(j\),最后就是用优先队列维护这个拓扑序。

考虑这其实是一个对无向图定向的过程。我们贪心地从小到大考虑,从这个点向儿子定向,然后继续递归定向。因为考虑这个点儿子的儿子,如果它与这个点没连边,那么交换儿子和儿子的儿子,儿子的儿子就会与这个点交换一定不优。如果它与这个点连边,由于我们 dfs 的过程是从小到大枚举的出点,所以一定是更优的。

注意不能用 bfs,因为注意到上面有连边的情况,画画图就知道了。


Get Ready for the Battle

考场上拼算法+乱贪心获得了 90 pts 的好成绩。(

容易猜到答案就是 \(\lceil \frac {\sum hp_i} {n}\rceil\),考虑构造使前 \(ans-1\) 轮没有一个人的名额浪费。

考虑前缀和排序后差分,发现分组的情况就可以是这个差分数组。

注意要加入 \(n\),而且最后一个前缀和是没有意义的,因为不是所有数都能刚好填满的,所以这个数替换成 \(n\) 即可。


[HNOI2019] 校园旅行

暴力 \(\mathcal O (m^2)\) 是 naive 的,考虑减少边数。

有个关键的观察是这个题可以来回跳,所以跟奇偶有关。

考虑只连同色边,发现如果是二分图就保留生成树,否则保留生成树再多个奇环即可。

异色边同理,只保留生成树。

时间复杂度:\(\mathcal O (n^2)\),这个题还是很妙的。


[AGC004F] Namori

这也太难想到了吧。

考虑将图二分图染色。那么一次操作就会变成交换两个数的颜色。(其实这样构造还是和奇偶有关)

所以我们将奇数层设置为 \(1\),偶数层设置为 \(-1\),设 \(a_i\) 为子树权值和。

如果原图是树,还是不难猜到答案就是 \(\sum |a_i|\)。如果 \(a_{root}\) 不为 \(0\) 无解。

如果有环,考虑 dfs 树,再处理这条边(设其为 \(S-T\),其中 \(d_S<d_T\))的 \(\delta\)

如果是偶环,奇偶不变,所以 \(a_{root}\) 不为 \(0\) 也无解。

考虑这条边的流量是 \(x\)。那么答案就是 \(|x|+\sum |a_i-x|\)\(i\)\(T\)\(S\)(不包含 \(T\) 的所有点),取中位数即可。

否则奇偶改变,就是同时将两个同色的节点改变。所以这个时候 \(a_{root}\) 为奇数无解。发现这条边的流量就是 \(\frac {a_{root}} {2}\),所以这条路径的 \(a\) 减去 \(\frac {a_{root}} {2}\)\(S\) 到根节点减去 \(a_{root}\)。(当然答案要先加上 \(|\frac{a_{root}}{2}|\) 表示这条边的流量)

如果你把 \(S\) 作为根要好写一些。但如果你想深入理解本题,我建议随便以一个任意点为根。

可以看我实现:https://atcoder.jp/contests/agc004/submissions/45706596。


【UR #9】App 管理器

依次将边定向,如果 \(S\) 能到 \(T\) 就定向为 \(T\rightarrow S\),否则定向为 \(S\rightarrow T\)

证明可以自己画一下图。不理解就去看 uoj 的题解。


[ARC165D]Substring Comparison

我能场上秒掉 AT *2600,甚至做题能10min切 *3000,但是 CF 切不了 *1900 和 *2100, 我还是状态选手啊!!!

考虑 \(A_i \rightarrow C_i\),将同一个强联通的缩点。再怎么比较一下即可。看我代码吧,很清楚的。

https://atcoder.jp/contests/arc165/submissions/45718370


[ARC165E]Random Isolation

本来这个题也可以再想想的,被 CSBZR 搞心态了。

[PKUWC2018] 猎人杀 很像的转化,我们统计所有排列,如果当前数所在连通块大小 \(>k\) 就删去,答案加 \(1\),求答案的期望。

其实没想到上面那个也没有关系,根据期望的线性性质,我们可以统计子树 \(T'\)\(|T'|>k\)),发现答案就是 \(\sum P(T')\)。若与 \(T'\) 直接相连且不在 \(T'\) 中的点有 \(y\) 个,\(|T'|=x\),那么概率就是 \(\frac {x!y!} {(x+y)!}\)

\(dp_{i,j,k}\) 为以 \(i\) 为根,\(j\) 个点在这个连通块,\(k\) 个相连点的方案数。

时间复杂度 \(\mathcal O(n^4)\)


「JOI 2013 Final」彩灯

中间那一段翻转了要与两边接起来,且这三段都是交错段。

直接找出极长的三段连续段的最大值即可。


「JOI 2013 Final」 现代豪宅

直接对关键点和起点终点进行连边,其中行相邻和列相邻连边,注意拆点,跑最短路即可。


CF1147F Zigzag Game

前置知识是二分图博弈,可以看一下这个题。[JSOI2009] 游戏

所以如果没有边权的限制,那么后手必胜。我们猜测在这个问题中也是后手必胜。

如果 \(a,c\) 在左部,\(b,d\) 在右部,有 \(a\rightarrow b \rightarrow c\rightarrow d\) 的路径,且 \(w(a,b)<las\)\(w(b,c)>w(a,b)\),那么此时我们肯定想要 \(w(c,d)<w(b,c)\),发现这其实是一个稳定婚姻问题。在左部优先级为从小到大,在右部优先级为从大到小即可。

稳定婚姻问题的时间复杂度是 \(\mathcal O (n^2)\) 的。


「JOI 2013 Final」JOIOI 塔

正着做倒着做好像都不是很行。瓶颈在于 I 的含义有两个。

直接二分,这样你就会发现倒着贪心是对的。OI 没到阈值 \(mid\)I 就一直放在底部。


[ABC261Ex] Game on Graph

就你数据水是吧。令 \(f_{x,0}\) 为到这个点的最小权值,\(f_{x,1}\) 为到这个点的最大权值。

\(f_{x,0}=\min(f_{y,1}+w(x,y))\)

\(f_{x,1}=\max(f_{y,0}+w(x,y))\)

当时场上我是遇到环直接 return,加一些判断,数据水竟然过了!这直接导致了联合省选 2023 D2T1 我成为了历史。(

正解不是很容易想到啊。考虑用 dijkstra 维护这个过程。\(f_{x,0}\) 被更新一次就可以确定值了,\(f_{x,1}\) 必须要被最大的数更新,记录一下度数就好了。


[IOI2016] railroad

[省选联考 2020 B 卷] 丁香之路 跟这个题思路好像差不多,但那个题我花了很久切掉了,这个题又不会了。


[AGC061A] Long Shuffle

手玩后可以发现若 \(n\) 是偶数,只会是 \(a_{2i-1}\)\(a_{2i}\) 调换。

考虑 \(s(l,r)=s(l,r-2)\oplus s(l+1,r-1) \oplus s(l+1,r-1)\oplus s(l+2,r)=s(l,r-2)\oplus s(l+2,r)\),归纳证明即可。

\(f(x,y)\)\(s(1,2x)\)\((2y-1,2y)\) 是否调换。发现 \(f(x,y)=f(x-1,y)\oplus f(x-1,y-1)\)(非法的可以设置为 \(0\)),发现就是 \(\binom {x-1} {y-1}\) 的奇偶性。

奇数的话拆成 \(s(1,2n-1)\)\(s(2,2n)\) 做就可以了。


签到题

设置一个 dp 一定要反复推敲它的意义!

不考虑位置的限制就设 \(dp_{i,j,k}\)考虑前 \(i\) 位,与 \(j\) 位数相差 \(k\) 的数的和。 事实上我考场上写出了这个 dp,但是由于理解不深,所以正解没想出来。

加入这个前缀和,发现这两个限制是有联系的,都是对下标的限制。我们就可以像数位 dp 那样按位来 dp 就好了。

事实上这种思想我初三的时候就把类似的题切掉了,现在不会做了,证明现在学傻了。😟


[AGC061D] Almost Multiplication Table

没有战歌啊,根本燃不起来。😓

值域很大,但这个题的复杂度显然和值域有关。

观察一下式子,乘积其实能让我们想到根号的东西。考虑先二分一个 \(mid\),则 \(a_{i,j}-mid\leqslant x_iy_j\leqslant a_{i,j}+mid\)

发现这两个变量小的那个是根号级别。

不妨设 \(x_n\leqslant y_m\),另外一部分镜像做就可以了。

则对于 \(i:1\rightarrow n\)\(x_i=\max(x_i,x_{i-1}+1,\max\lceil \frac {a_{i,j}-mid} {y_j} \rceil)\)

对于 \(j:1\leftarrow m\)\(y_j=\min(y_j,y_{j+1}-1,\min \lfloor \frac {a_{i,j}+mid} {y_j}\rfloor)\)

解释一下就是设置偏序关系后只用在一种数处理一类偏序关系即可,因为这个贡献感觉一下是可以传递的,但是还是很玄学啊。

正确性显然,因为万能的调整法是不能被质疑的。

时间复杂度 \(\mathcal O (\sqrt V n^3\log_2 V)\)。复杂度很好计算这里不写了。


[Ynoi2015] 盼君勿忘

感觉还是得往子序列自动机的方向思考。但是转移的关系都有 \(n^2\) 对呀?

感觉不是 log 做法,也不是分块。

😓。题面能不能说点人话。

image

考虑每一个数 \(x\) 的贡献,发现设区间长度为 \(len\),出现次数为 \(c\),那么这个数的贡献就是 \(x(2^{len} - 2^{len-c})\)

离线,考虑莫队,由于区间长度会变化,我们需要把所有数的信息存一下。想到根号分治,对于出现次数 \(<\sqrt n\) 的数,开个桶存下来即可。大于的就直接暴力记录下所有的。

具体实现就是发现出现次数 \(>\sqrt n\) 的全局必然也是,所以直接先预处理出这些数。然后需要 \(\mathcal O(\sqrt n)-\mathcal O (1)\) 的光速幂。


[AGC062B] Split and Insert

对排列求逆转化成将排列排序是 naive 的。

显然是 dp,下标是一直在变的,考虑把数放进状态里面。设 \(dp_{i,j,k}\) 为第 \(i\) 轮,已排序 \([l,r]\) 的数的最小代价。

转移就是 \(dp_{i,j,k}=dp_{i-1,j,k}\) 表示不操作。\(dp_{i,j,k}=dp_{i-1,j,x}+dp_{i-1,x+1,k}+c_i(k-x)\)

有点不是很理解这个题。到时候来补。


[AGC061E] Increment or XOR

这个题,,很难绷啊。我找个时间来补篇题解。


[ARC153C] ± Increasing Sequence

这个题我当时怎么会没切掉啊!加训!

先令序列为 \(\{1,2,3...,n\}\),再调整。如果 \(S=0\) 就有解了。

\(S>0\),那么我们希望在一个正的前缀减少,或者在一个负的前缀增加。因为值域是 \(\{-1,1\}\),所以前缀/后缀一定会有 \(1\) 的出现,直接修改即可。

\(S<0\) 同理。

正确性可以感觉一下,因为我是感觉选手。


[ARC153D] Sum of Sum of Digits

好熟悉的感觉,当时我好像补了这个题的。

考虑第 \(i\) 位的进位情况是一个连续的区间。所以可以设一个二维 dp。

转移的话枚举当前的状态,发现 \(x\) 在这一维的取值只会有两种,枚举状态的时候顺便处理出这一位的最小值,记录下他们在上一层排名的最大值为分界点即可。tmd,好像还是得枚举两层的状态。

那就枚举上一层的状态和 \(x\) 在这一维的取值,发现这一层的状态可以直接计算。转移即可,

所以复杂度是 \(\lg V(n\log_2 n+n\lg V)\)。桶排亦可。


[ARC164E] Segment-Tree Optimization

这个题还是很好的。

刚开始肯定是需要一个结论的,强势猜测:把所有的点离散化分成 \(x\) 个区间,那么深度就是 \(\lceil \log_2 x\rfloor\)。正确性显然。注意这里的点是 \(l-1\)\(r\) 而不是 \(l\),因为区间不交。

然后考虑一个区间能到达叶子的个数似乎就是 [包含的最左边的叶子是右儿子] + [包含的最右边的叶子是左儿子]。

\(dp_{i,j,k}\) 表示前 \(i\) 个叶子放了 \(j\) 个小区间的最小叶子数。转移的话发现一个区间中只会是开头和结尾的小区间产生贡献。如果断点为 \(i\),贡献就是 \(cntr_{i-1}+cntl_i\)。注意到贡献要乘 \(2\),因为一个小区间到了叶子另一个也会。不难发现贡献不会算重。

可能和题解实现有点不一样,tmd数组开小了,我还一直怀疑我的写法是错的。

https://atcoder.jp/contests/arc164/submissions/45791965


[ARC093F] Dark Horse

这个背景看起来很典。考虑用 dp 维护一个类似容斥的东西。但是既要维护这些人的状态,也要维护深度的状态,有点难搞。

一个经典的处理是容斥的状态不用保留,只用每次加的时候乘上容斥系数即可。所以 \(A\) 从大到小排序后 dp 即可。时间复杂度 \(\mathcal O (nm2^n)\)


[ARC078F] Mole and Abandoned Mine

发现最后图的形式只会是一条链,每个点上挂一堆点。所以我们其实可以钦定一个点集挂在哪个点上。

可以设 \(dp_{i,j}\) 表示链最末尾是 \(i\) 状态 \(j\) 的最小花费。\(\mathcal O (3^n n^2)\) 转移是 trivial 的。

观察这个形式,发现转化成保留比边权和最大要容易一些。

但是你会发现这两维的转移是一个相对独立的过程。所以可以分开做。

\(dp_{i,j}=dp_{i\oplus2^j,k}+e_{j,k}\)

\(dp_{i,j}=dp_{i,j\oplus k}+f_k+g_{k,i}\)\(f_k\) 表示块边权和,\(g_{k,i}\) 表示 \(i\)\(k\) 的连边。

时间复杂度是 \(\mathcal O (3^nn)\)。如果是求方案数还是得多个 \(n\)


CF1103D Professional layer

考虑将原始的 \(\gcd\) 质因数分解,普通状压 dp 的复杂度是 \(\mathcal O (3^m nm)\) 的。其中 \(m \leqslant 11\)

感受本题的特殊性,发现是在因数和倍数的背景下,考虑从数值/值域上优化。

首先可以把相同的 \(\prod p^a\) 放在一起,并只保留 \(m\) 个数。打表发现这样状态只有 \(M<12000\) 个。这步的时间是 \(\mathcal O (nm+n\log_2 n)\) 的。现在总复杂度是 \(\mathcal O (3^mMm^2)\) 的。

处理出 \(v[s]\) 表示质数集合为 \(s\) 时哪 \(m\) 个数会被选。这样复杂度就变成了 \(\mathcal O (3^m m^2)\)

而预处理 \(v[s]\) 的复杂度是 \(\mathcal O (M 2^mm)\) 的,这就是找出 \(M\) 的原因。

这个题的思路很自然的,确实是道好题。


CF1540C2 Converging Array (Hard Version)

TMD,本来能切掉的,考试只做掉了 easy version。

如果 \(l\) 等于 \(0\) 就是前缀平均数最小值 \(\geqslant x\)\(l\) 不等于 \(0\) 就是形如 \(x_2-x_1\geqslant l_1\)\(x_3-x_2\geqslant l_2\)。稍微处理一下发现也就是对类似前缀的限制。

观察出那个结论后不难想到一个 \(100^3\) 的 dp,这样就能过 easy version。

考场上我已经观察除了 \(ans > 100\) 答案是 \(0\),但是由于答案的下界不是 \(-100\),所以我就以为是某个神秘容斥。🤡

事实上,我们只用观察 相对的下界,也就是值域范围。不妨把式子写出来,若所有的 \(ix+ppre<0\),那么答案是 \(\prod (c_i+1)\)。若存在 \(ix+ppre>pre[i]\),答案是 \(0\)。也就是说,我们需要计算的大概是 \(\frac {pre[i]} {i}\) 值域大小的 \(x\),发现这样只用跑大概 \(100\) 次。所以能加减枝就加减枝!

太小丑了!加训!加训!


[APIO2016] 烟火表演

想不出 polynomial 做法?有可能是直接「维护值域」。

想到一个朴素的 dp 是 \(f_{x,j}=f_{y,k}+|k-j-l|\)\(k \geqslant j\))。

看到绝对值函数,我们可以归纳法证明这个函数斜率递增。考虑这个函数转移的时候的变化。

令斜率为 \(0\) 的区间为 \([L,R]\)。边权为 \(l\)

\(j\leqslant L\)\(f'(j)=f(L)+l\)

\(j\in (L,L+l]\)\(f'(j)=f(L)+|j-L-l|\)

\(j \in (L+l,R+l]\)\(f'(j)=f(L)\)

\(j>R+l\)\(f'(j)=f(L)+|j-R-l|\)

发现是将 \([L,R]\) 向右平移 \(l\),把 \(R+l\) 右边的改成斜率为 \(1\) 的直线,把 \([L,L+l]\) 改成斜率为 \(-1\) 的直线。

对应成 slope trick,就是把右边表示斜率为正的分界点直接删掉,再把最大的两个分界点 \(+l\) 即可。

这个其实很好找,由于子树传上来斜率为 \(0\) 的分界点只有 \(1\) 个,我们直接删去最大的 \(d_x-1\) 个分界点即可。

发现 \(f(0)\) 就是边权之和,所以简单算算即可。用可持久化左偏树合并所有断点(不去重),时间复杂度 \(\mathcal O (n\log_2 n)\)


[AGC012E] Camel and Oases

考验智慧的。

发现跳跃次数只有 \(\log\) 次。所以可以抽象成:有 \(\log\) 层分层图,每一层选一个区间,覆盖完整个区间。

\(dp_{i}\) 为状压状态 \(i\) 能走到的最远的地方。这其中其实蕴含了一个 bool 转 int 的优化。所以单次 dp 的复杂度是 \(\mathcal O (V\log_2 V)\) 的。

观察到如果第一层的段数大于 \(\log_2 V\) 一定无解,因为这个限制其实比整体的限制要更宽松。

所以时间复杂度其实是 \(\mathcal O (V\log^2 V)\) 的。


CF713C Sonya and Problem Wihtout a Legend

考虑维护这个函数。每次加入一个绝对值函数的时候,先加入两个点表示相对的斜率的变化。

要把最大的那个分界点删掉,表示删除了斜率为 \(1\) 的直线。动态维护最小的 dp 值就好了。


CF1515G Phoenix and Odometers

一眼典,但发现是有向图。

发现一个重要性质是若存在一条 \(x\rightarrow y\) 权值为 \(z\) 的路径,那么一定有 \(y \rightarrow x\) 权值为 \(-z\) 的路径,证明是走 \(P\) 次即可。

所以可以规约到无向图,找出形如 \(d_x-d_y+e(x,y)\) 的基环即可。


[AGC020F] Arcs on a Circle

怎么最近这么下饭呢?/kk

这个有小数看起来很不好操作啊。但其实你会感觉到如果它们小数部分的排名确定,那么方案数也确定了。

所以直接枚举小数部分的排名,这样你发现值域被离散化成了 \(nc\)。直接在上面dp即可。

这个 dp 也是有细节的。注意到本题是环,这可不好搞。但倘若我们令最大的那一段为开头就变成线性了,因为这个段不会被包含。

所以我们 钦定最大的那一段以 \(0\) 开头,其他段的排名实际上是与它的相对距离

\(dp_{s,i}\) 表示用了 \(\{s\}\) 的段,填了前 \(i\) 个的方案数。转移时枚举以哪个位置作为开头,那么其实这个段也确定了,直接转移即可,注意要与原来的比 max。

细节是 dp 的顺序是「枚举以哪个位置作为开头」,因为如果你直接枚举状态和这一次选哪个数,遇到包含的情况会重复。 因为这个调了好久。(

最后将 dp 值的和除以 \((n-1)!c^{n-1}\) 即可。时间复杂度 \(\mathcal O ((n-1)!2^{n-1}(n-1)^2c^2)\)


CF917D Stranger Trees

把式子写成求重复边的和子集容斥再二项式定理得到了对每条边考虑的傻逼式子望周知。

有点套路,设 \(f_k\) 为恰好 \(k\) 条边重复的方案数,\(g_k\) 为至少有 \(k\) 条边重复,我们去选择这 \(k\) 条边 的方案数。那么 \(g_i=\sum_{j=i}^{n-1}\binom j if_j \Rightarrow f_i=\sum_{j=i}^{n-1}(-1)^{j-i}\binom j i g_j\)。注意组合数不要漏掉了。

如果固定一个边集,那么答案就是 \(n^{k-2}\prod s_i\),这个 dp 就好了。设 \(dp_{i,j,k}\) 为以 \(i\) 为根,连通块大小为 \(i\),选了 \(k\) 条边的方案数。

所以 dp 就好了。时间复杂度 \(\mathcal O (n^2)\)。非常套路。


[ARC153F] Tri-Colored Paths


月末赶进度!传统艺能!急急急!!!


[AGC058C] Planar Tree

又来 ad-hoc

首先注意到并不用输出方案,可以想一点充分/必要条件。

观察得到两个相同的相邻数可以缩,进而发现 \(1-2\) 可以变成 \(2\)\(3-4\) 可以变成 \(3\)。我们先这样简化序列。

但是还不够,继续观察发现 \(1-3-2\) 可以变成 \(2\)\(2-4-3\) 可以变成 \(3\)\(3-2-3\) 可以变成 \(3\)\(2-3-2\) 可以变成 \(2\)

就是说,每次可以少一对 \(1-3\)\(2-4\)\(2-3\)

所以翻译一下就是 \(cnt_1<cnt_3,cnt_2<cnt_4\),不能取等是因为比如 \(1-3\) 的消除需要 \(2\),就不能把 \(2\) 消完。

其实这种缩情况再判断的情况比较常见的。

手玩代替证明了。


[AGC058D] Yet Another ABC String

我去年胡出了一种容斥做法,但是现在忘了。

一眼容斥。你可能会想容斥不合法子串的个数,但是会交叉啊!

所以想到容斥极长不合法子串的开头个数。极长的意思是把交叉的情况扩展。

先把 \(a-i\)A\(b-i\)B\(c-i\)C 排好,方案数为 \(\frac {(a+b+c-3i)!} {(a-i)!(b-i)!(c-i)!}\)

向里面插数。发现开头和中间插入不一样。

如果开头不插入,方案数是 \(\binom {a+b+c-3i-1+i} {i}\times 2^i\)\(2^i\) 表示每个位置实际上只能填两种串。

如果开头不插入,方案数是 \(\binom {a+b+c-3i+i-1} {i-1}\times 2^{i-1}\times 3\)

即可。所以容斥的东西是灵活的。


POJ3834 Graph Game

有点妙啊。这种题先找充分必要条件吧。

先给出一个结论:如果能找出两棵边集不交的生成树,那么 Bob 赢,否则 Alice 赢。这个结论倒是限制后手的。

必要性很显然,如果 Alice 断开了连接两个连通块的边,Bob 一定能找到一条边联结这两个连通块。

充分性的话,如果没有两棵边集不交的生成树,Bob 想必赢的局面一定是复制蓝边,存在两棵不同生成树。因为 Alice 先手,所以 Alice 可以仿照 Bob 的策略,那么 Alice 一定能找出一棵生成树。这时 Bob 找不出一棵完整的生成树。所以 Alice 必胜。

数据范围小,直接爆搜。


草莓蛋糕20230927C

考场上打了 6k 的线段树分治+线段树。想的是一个一个加算贡献。

事实上可以不用这个线段树分治啊。\(a_x+a_y\geqslant b_x+b_y \Rightarrow a_x-b_x\geqslant b_y-a_y\),已经是独立的式子的,放进一个线段树里面合并即可。

所以其实是有整体算贡献的思想的。多想想这类数据结构吧。


CF878E Numbers on the blackboard

事实上,有些题如果我们摒弃去研究冗杂的过程,而是整体观察性质或钦定一个顺序/全局贪心,会有不一样的感觉。

贪心有 70 pts,好!

事实上已经很接近正解了,如果不给我说这个题是*3300说不定可以做出来。 考虑贪心的过程是从后往前合并,如果后面的 \(<0\) 就不合并。最后的答案是第一个合并块+后面合并块的两倍。

如果我们从左往右扫右端点,会得到若干块。事实上左端点位于何处不影响这几个块的分布,所以直接对块前缀和再随便块内二分一下就好了。注意块内可以用 归纳法 证明是 \(1,2^1,2^2,2^3...\) 的系数分布。

事实上显然有 \(ans=\sum a_i2^{p_i}\),题解观察到了 \(p_i\leqslant p_{i-1}+1\),进而发现 \(p_i=1\)\(p_i=p_{i-1}+1\),可以很大程度上地辅助思考。

zxy 是用二叉树理解设计 dp,再观察到这个 dp 意义的。湘妹儿牛逼。

差点就做出来了啊!


[AGC060B] Unique XOR Path

如果出现一个拐角,那么会多一种情况。因为要这些数线性无关,所以拐角的个数要小于等于 \(k\)。注意到一个拐角可以和另一个对面的拐角无关,比如:

image

翻译到序列上就是拐角的构成字母不能与其他拐角公用,贪心选即可。

讲得很抽象,看代码吧:https://atcoder.jp/contests/agc060/submissions/45991984


[AGC060C] Large Heap

咕咕咕。


🕊️ [APIO2017] 斑斓之地

我是🕊️,我在填前面的巨坑。

根据连通图有 \(|V|-|E|+|F|=2\) 统计答案,由于最外面的不算,所以 \(|V|-|E|+|F|=1\)。全局的 \(|V|-|E|+|F|\) 就是连通块的个数。如果 \(|F|=0\),发现就是树的情况。

\(|V|\)\(|E|\) 都是二维数点,\(|F|\) 的贡献由两部分组成:2*2 的小格和围成空格子连通块的数量。

image

第一种情况也是二维数点,第二种情况的出现当且仅当这个区间完全包含了河流,特判即可。


🕊️ CF321D Ciel and Flipboard

我是🕊️,我在填前面的巨坑。

这个 \(m=\frac {n+1} {2}\) 很有性质啊。

\(c(x,y)\)\((x,y)\) 的系数,发现 \(c(x,y)\oplus c(x,m)\oplus c(x,y+m)=0\)\(c(x,y)\oplus c(m,y)\oplus c(x+m,y)=0\)。这个式子的含义是中间那个一定会被选,两边的会被选择一个。

这提醒我们如果知道前 \(m\times m\) 的系数就可以得到答案。察觉到操作总数也只有 \(m\times m\) 种,随便云一下发现操作线性无关。所以操作序列可以被映射到 \(c\) 上。但是我还不会证明为什么是个双射,应该可以归纳一下吧。

然后这个式子已经相对独立了。如果我们枚举 \((i,m)(i\leqslant m)\),就可以贪心一列一列地确定值。

估计有点不好懂,可以看看代码:https://codeforces.com/contest/321/submission/225728173


[省选联考 2021 A 卷] 矩阵游戏

初二省选考场乱搞 75 pts,乐死我了。

方程有 \((n-1)(m-1)\) 个,那么变量就只有 \(n+m+1\) 一个,可以钦定为第一行和第一列。

我尝试用这几个主元表示,得到的是形如 \(a_{1,1}\pm a_{1,i} \pm a_{i,1}=val\) 的形式,如果你把 \(a_{1,1}\) 拆成两份似乎得到了对称的形式,但是由于 \(a_{1,1}\) 是变元,似乎还是不行。

考虑先设这些主元都是 \(0\) 再调整。每次可以对一列或一行 \(+w -w +w -w...\)。显然这样的调整是充足的。

然后你会得到 \(0\leqslant l_i\pm h_j \leqslant 10^6\)。有加,观察一下同奇偶会同号,所以令下标奇数的 \(l_i\) 取反,下标偶数的 \(h_j\) 取反即可。

直接 spfa 跑差分约束即可。


posted @ 2023-09-01 21:56  Saintex  阅读(95)  评论(2编辑  收藏  举报