做题记录 26.4.7

\(\textcolor{blue}\odot\) P9614 [CERC2019] Ponk Warshall

每个字符建立一个点,字符串中相同下标的字符连有向边,则答案为边数减去最大环数,后者可以从小到大枚举每种长度的环求出

时间复杂度 \(O(n)\)

代码

\(\textcolor{blue}\odot\) P3677 [CERC2016] 关键的膝盖 Key Knocking

\(d_i=s_i\oplus s_{i+1}\),则等价于给定 \(d_{0\sim 2n}\),每次操作翻转 \(d_{i-1}\)\(d_{i+1}\),操作不超过 \(n\) 次使得最终 \(d\)\(0\) 的数量不超过 \(n\)

按长度为 \(3\) 分块,若一块中有不少于 \(2\)\(0\),若首尾都是 \(0\) 则一次操作消去两者,否则中间必然为 \(0\),通过一次操作换到下一块

代码

\(\textcolor{purple}\odot\) P9607 [CERC2019] Be Geeks!

单调栈维护区间 \(\max\) 暴力向前跟新直到不变维护 \(\gcd\),线段维护即可,时间复杂度 \(O(n\log n+n\log V)\)

代码

\(\textcolor{purple}\odot\) P7013 [CERC2013] History course

线段树优化 CF309E Sheep 即可,时间复杂度 \(O(n\log^ 2n)\)

代码

参考

QOJ #2475. Bank Robbery

可证必胜当且仅当可放置数量大于非叶子结点数量

若要防守,在每个非叶子结点上放一个,然后剩下的放在叶子上,每次攻击若已经有则不动,否则选择一个已经有的叶子把整条链整体移过去

若要攻击,每次选择子树内存在非空叶子且其父亲非空的结点中深度最大的一个,可证必然存在,且每次选择时深度递增,显然到根时胜利

代码

参考

\(\textcolor{purple}\odot\) AT_agc029_e [AGC029E] Wandering TKHS

对于一个 \(x\),考虑多少 \(y\) 会对其产生贡献

\(z=\text{lca}(x,y)\),则 \(y\) 产生贡献当且仅当 \(z\)(不含)到 \(y\)(含)路径最大值 小于 \(z\)(不含)到根的路径最大值

由此对于一个 \(y\),合法的 \(z\)\(y\) 到根的链上的一段后缀,且这段后缀可以通过 \(y\) 到根的链上的最大值和次大值求出

从而这个 \(y\) 可以贡献到的 \(x\) 为一个子树,树上差分即可

时间复杂度 \(O(n)\)

代码

参考

\(\textcolor{purple}\odot\) AT_agc030_c [AGC030C] Coloring Torus

对于 \(k\le 500\) 的情况,建立 \(k\times k\) 的矩形,第 \(i\) 行全填 \(i\) 即可

对于 \(k>500\) 的情况,先改为 \((i-j)\bmod n\) 相同的 \((i,j)\) 填同一颜色,此时变为 \(n\) 条斜线(除了最长的一条外其余都是两条拼接,不过没有影响),选择若干条斜线,每条交错填两种数即可

代码

参考

\(\textcolor{purple}\odot\) AT_agc030_d [AGC030D] Inversion Sum

求出每个数对为逆序对的概率和,乘以 \(2^q\) 即为答案

\(f_{i,j}\) 表示目前 \(a_i<a_j\) 的概率

一次操作 \(x,y\),会让 \(f_{x,y}\gets f_{y,x}\gets \frac{f_{x,y}+f_{y,x}}2\)\(f_{x,i}\gets f_{y,i}\gets \frac{f_{x,i}+f_{y,i}}2\)\(f_{i,x}\gets f_{i,y}\gets \frac{f_{i,x}+f_{i,y}}2\)

容易做到 \(O(n(n+q))\)

代码

参考

\(\textcolor{purple}\odot\) AT_agc031_d [AGC031D] A Sequence of Permutations

可证 \(a_n=A\circ a_{n-6}\circ A^{-1}\),其中 \(A=q\circ p^{-1}\circ q^{-1}\circ p\)\((a\circ b)_i=a_{b_i}\)

容易做到 \(O(n\log k)\)

代码

参考

posted @ 2026-04-08 07:13  Hstry  阅读(3)  评论(0)    收藏  举报