我在线上公开赛的一生
前言
$2026.7.10 \sim $
如果我 \(\text{CF}\) 上红了,那么我的 \(\text{CF}\) 就会上红。
小不忍则乱大萌(๑• . •๑)
\(\text{7.12 CF}\)
\(-43\)
\(\text{lce4113 and Security Game}\)
考虑直接令 \(x=1\),然后得到 \(o\)。
若 \(o=0\),则可以确定操作是与,并且 \(v\) 的最后一位为 \(0\)。
若 \(o>1\),则可以确定操作是或,同时得知 \(v\) 的某一位 \(1\)。
以上两种情况都很好求出 \(b\)。
若 \(o=1\),当实际的 \(v > 1\) 的时候,则可以得知操作是与和 \(v\) 的最后一位,同时,即使实际的 \(v=1\) 时,我们无法得知实际操作,但我们依旧可以钦定操作是与,这不影响后续计算。
也就是说如果保证 \(v\geq 1\),那这个算法就是正确的,我们可以推测出 \(v\) 的最后一位。
那么只需要判断 \(v\) 是否为 \(0\) 即可。
考虑到当 \(v=0\) 时,一定有 \(r \in \{m_0,m_1\}\)。
那么让 \(m_0,m_1\) 在不影响判断 \(b\) 的情况下,进行一些随机,就可以让 \(v\not= 0\) 的时候极大概率满足 \(r\notin \{m_0,m_1\}\)。
于是我们完成了对 \(v =0\) 的判断,这道题就做完了。
\(\text{Whoname and Unsorted Array}\)
先考虑无解条件,找“不变量”即可。
考虑排列的逆序对数的奇偶性,每次操作会把序列分为两个部分,若 \(n\) 为奇数,两部分长度奇偶性不同,则把 \(p_i\) 移至开头导致的逆序对变化量和把 \(p_{i+1}\) 移至结尾导致的逆序对变化量奇偶性不同,所以会导致总逆序对数奇偶性改变;若 \(n\) 为偶数,则不会导致其奇偶性改变。
所以若 \(n\) 为偶数,且初始逆序数为奇数,则一定无解。
接下来考虑归纳构造,若当前排列已经有了一个长为 \(x\) 的后缀 \(1,2,3,\dots,x\),考虑在不改变该后缀的结构时把 \(x+1\) 移到末尾。
若 \(x+1\) 不在开头,直接移即可。
若 \(x+1\) 在开头,先操作 \((2,3)\),这样 \(x+1\) 就会变到位置 \(2\) 去,然后操作 \((1,2)\),把它移到末尾,最后操作 \((n-1,n)\),把之前移到末尾的垃圾给扔回去即可。
如果未归位的数的个数不足 \(3\) 个需要特殊处理一下,具体参考官解。
感觉这类题很有共性。
都是先通过不变量(逆序对,奇偶性等等)找到有解无解的必要条件,这个大概率就是充分的。
然后考虑归纳进行构造,有些难一点的题可能要用几次操作组合出来一个比较好用的“复合操作”进行构造。
\(\text{7.12 ARC}\)
\(+16\)
\(\text{Angst for All Pairs}\)
稍加观察,可以发现一张卡片本质上是将写在上面的数和没写在上面的数划分成了两部分,最终要让每个数都被单独划分出来。
再转换一下视角,从数来看,则是要求每个数所覆盖的卡片集合都不一样。
那就很简单了,相当于是给每个数 \(i\) 分配一个长度为 \(n\) 的 \(01\) 串 \(s_i\),代价为 \(\log_2 i \times \text{popcount}(s_i)\),随便贪心一下即可。
\(\text{AND/OR}\)
对于单独一位来看,在使用按位或的次数最少的情况下要保留下来的策略:在其最后一次出现时进行一次或,并且后续一直或。
那么对于每一位,我们可以得知它想要保留下来最少要用多少次或,这个次数若超过 \(k\),则一定不行。
那么对于所有最少或次数不超过 \(k\) 个的位,直接把最后 \(k\) 个数或起来就能都保留下来。
即 \(m=\bigcup_{i=n-k+1}^n a_i\)。
接下来考虑计数,\(\text{DP}\) 是显然不好做了,肯定要往组合方向思考。
倒着考虑每一个数的选择,若当前数 \(a_i\) 不是 \(m\) 的超集,那么必须选择或,同时 \(m\) 中被 \(a_i\) 包含的那些位在后续就不用管了,可以直接去掉。
若当前数是 \(m\) 的超集,就既可以选择或,也可以选择与。
-
如果选择与,就啥都不变继续做。
-
如果选择或,则更靠前的数都可以乱选,若当前还剩 \(cnt\) 次或可以用,那么贡献的方案数即为 \(\sum_{j=0}^{cnt-1} \binom {i-1}{j}\),注意当前位也要用一次或。
这里直接暴力的时间复杂度是 \(O(n^2)\)。
但是注意到贡献是组合数某一行的前缀和,众所周知这个东西在行数或列数 \(\pm 1\) 时可以 \(O(1)\) 修改,于是不难优化到 \(O(n)\)。
\(\text{7.16 CF}\)
\(+43\)
刚扣的分又加回来辣!
\(\text{Familiar}\)
考虑放在笛卡尔树上刻画,那么点 \(i\) 能够对 \(j\) 产生 \(1\) 的贡献当且仅当 \(j\) 是 \(i\) 的第一个右祖先。
然后考虑区间 \(\text{DP}\),令 \(f_{i,j,x}\) 表示区间 \([i,j]\) 组成一棵子树,同时内部有 \(x\) 个点没有右祖先,再令 \(g_{i,j}\) 表示内部无右祖先点数没限制时候的答案。
写出转移发现对于区间 \([i,j]\), 若 \(a_{j+1}=-1\),则只有 \(g_{i,j}\) 是有用的,否则只有 \(g_{i,j}\) 和 \(f_{i,j,0\sim a_{j+1}}\) 是有用的。
那么总状态数其实只有 \(n \sum_{i=1}^n [a_i\not= -1] a_i = O(n^2)\) 个,故最终时间复杂度 \(O(n^3)\),空间复杂度 \(O(n^2)\)。
好题啊。
\(\text{Tom and Jerry}\)
考虑到一次操作的本质是把一条链上的边全都删掉,然后分裂成若干连通块,这些连通块都是子问题,下一次操作的人需要在其中去选择一个子问题去递归进行。
若我们将第一次操作的链的某个端点定为根,那么不难注意到每条路径都是自上而下的单链。
进一步地,无法操作时一定是仅剩一个孤立点的局面。
然后官解是通过定义上一次操作的路径上的点的度数奇偶性来定义了必胜态和必败态,感觉非常的神秘。。
ytt 说这道题很类似:\(\text{link}\)。
\(\text{Construct an Array}\)
官解做法好像比我的巧妙?但是我决定还是写我的做法。
注意到 \(\text{D1}\) 相当于是给定了所有数的正负性,我们可以直接拿绝对值出来跑差分约束。
但是 \(\text{D2}\) 没有给定正负性,考虑构造一组合法的正负性。
对于 \(a_i+a_j <0\),若 \(a_i\) 为正,则 \(a_j\) 一定为负,另一种限制同理,不难发现这是一个 \(\text{2-SAT}\),这道题就做完了。
但是有一个问题是,若 \(\text{2-SAT}\) 跑出两组解 \(A\) 和 \(B\),关于 \(A\) 的差分约束有解而关于 \(B\) 的差分约束无解怎么办?
即需要证明,若对于某组合法正负性,其差分约束存在环,则对于任意一组正负性都存在环。
考虑一个环一定是由限制 \(1\) 和限制 \(2\) 交替构成的,那么对于环上任意一点,钦定其为正数或者负数时就可以推导出环上每个数的正负性。
换句话说,若某组正负性对应的差分约束存在环,则可以推出一个交替的限制关系环,由这个限制关系可以得出环上的数的正负性就必须是这组解这样或者全部取反,即任意正负性的合法解都必须包含这个环。
\(\text{7.19 ARC}\)
\(+26\)
\(\text{Gap Swap (easy)}\)
本来以为是什么 \(\text{DP}\) 的,发现大家都猜结论过了,就开始思考不变量。
一直在想和逆序对有什么关系,一次长度为 \(x\) 的操作最多可以使得逆序对减少 \(2x-1\)。
由于有一个 \(-1\) 的常数,用逆序对并不好直接求出答案。
不过关于排列,还有一个很牛的不变量是 \(S=\sum_{i=1}^n |i-p_i|\)。
你发现一次长度为 \(x\) 的操作可以使得 \(S\) 减少 \(2x\)。
所以答案即为 \(\frac {\sum_{i=1}^n |i-p_i|} 2\)。
然后我们可以构造性证明每次操作都能让这个值减少 \(2x\),即每次操作都会让两个数朝着各自的终点移动,且不越过终点。
\(\text{Gap Swap (hard)}\)
每次操作的代价均为 \(1\)。
这个时候逆序对就有用了,注意到逆序对变化量和 \(S\) 变化量的差值恰好就是 \(1\)!!!
所以造一个新的势能叫做 \(T=S-\text{inv}(p)\),每次操作都能够使得这个势能减少 \(1\),排列有序时 \(T=0\),故 \(T\) 即为答案。
进一步地,逆序对变化量最大和 \(S\) 变化量最大是显然在同一次操作中取到的,故构造证明和上一个题一样。

浙公网安备 33010602011771号