2025.1.10 近期练习
P3514 [POI2011] LIZ-Lollipop
我们需要重点利用值只有 \(1,2\) 的性质。我们可以用 \(1\) 将 \(2\) 分段模型化题目。
一个想法是选最左边的 \(1\) 为左端点,往右二分到第一个 \(\ge x\) 的位置,如果是 \(x+1\) 就将左端点右移。
但是这并不能涵盖所有情况,但是我们可以令最右边的 \(1\) 为右端点再做一遍。
如果上述两种情况都不能算出 \(x\),那么如果其合法那么一定是在最左 \(1\) 和最右 \(1\) 之外。
因为此时已经没有 \(1\) 可以用,那么奇偶性不会变,奇偶性不同就非法。
P3599 Koishi Loves Construction
先考虑 Task1 前缀和互不相同,观察得出:第一位必须填 \(n\)。
其次,\(n\) 必须不为奇数或 \(n=1\),因为 \(1+2+\dots+n-1=\frac{n-1}{2}\times n\),导致前 \(n\) 位一定整除 \(n\)。
考虑构造 \(0,1,-2,3,-4,\dots\),形成 \(0,1,-1,2,-2\) 可以做到互不相同。将负数加上 \(n\) 即可。
考虑 Task2 前缀积互不相同,观察得出:第一位必须填 \(1\),最后一位必须填 \(n\)。
同理地,\(\prod_{i\in[2,n-1]} i\neq 0\pmod n\),相当于 \(n= 1,4\) 或 \(n\) 是质数。
考虑构造,\(1,2,\frac{3}{2},\frac{4}{3},\dots \frac{n}{n-1}\),形成 \(1,2,3,\dots n\),可以证明互不相同,蒙对了。
P5361 [SDOI2019] 热闹的聚会与尴尬的聚会
这个题太厉害了。首先这个奇怪的限制我们可以先转化为最大化 \(p,q\)。
考虑最大化 \(p\) 的值,即找度数最小值最大的集合。
贪心地,我们只关注全局的答案,每次删掉度数最小的点,然后更新答案即可。
证明的话考虑最优解是一定能由每次删度数最小的点得到的。
或者类比检验二分 \(mid\) 的值是否合法,就是每次删度数 \(<mid\) 的点,并更新其他点。
最大化 \(q\) 的值即求最大独立集,这是个 NPC 问题我们只能用近似算法比如随机化。
然而我们考虑这个问题和第一问的联系,每次令度数最小的点加入独立集并删掉其相邻的点。
不难发现这样做刚好符合题意,因为我们加入一个点,删掉的点数量 \(\le p\),那么 \(q\ge n/(p+1)\)。
反证:如果删掉的点数量 \(> p\),那么此时一定存在一个集合其度数都 \(> p\),与第一问结论相反。
CF1325F Ehab's Last Theorem
神仙题。记 \(sq=\sqrt n\) 向上取整。
关于环的构造我们可以考虑 dfs 树。因为这是一个无向图那么 dfs 树没有横叉边,只有返祖边。
又因为没有重边,所以如果一个点有 \(x\) 个返祖边那么就存在一个大小为 \(x+2\) 的环。
若没有大小 \(\ge sq\) 的环存在,那么每个点最多有 \(sq-3\) 条返祖边存在。
考虑构造独立集,考虑用上最多有 \(sq-3\) 条返祖边的条件,我们考虑删一个点会造成的影响。
我们考虑删一个影响最小的节点,我们可以考虑取出最深的叶子节点然后将其加入独立集。
同时与其连接的点都要删去,但是我们最多只会删去 \(sq-3+1+1\) 个点。(返祖边,父亲,自己)。
相当于每次减去 \(sq-1\) 个点,\(sq-1\le \sqrt n\),那么一定可以做 \(\sqrt n\) 次。
若 \(\sqrt n\) 是整数,那么已经完成 \(\sqrt n=sq\) 了。否则此时一定不会删完,再选一个点达到 \(sq<\sqrt n+1\)。
这个题的启示?相当于独立集问题,考虑每次选出影响最少的点的贪心。
CF1198C Matching vs Independent Set
还是一道二选一构造题。由于边独立集就是匹配,这个比较好入手。
我们有一个随机化的方法,就是打乱边的顺序,然后从前往后加入,能加就加。
这给了我们一个启示,其实不需随机化,从前往后加入,将两端点都没有覆盖的边的端点覆盖。
若此时已经加入 \(n\) 条边,那么已经满足题意,否则没被覆盖的点一定有 \(>n\) 个。
显然地,不存在两个没被覆盖的点相邻,要不然一定加入边集了,所以剩下就是一个独立集。
这个题也挺神。
CF1019C Sergey's problem
我们考虑弱化题目,如果题目是一个 DAG 我们该如何做。
考虑按照拓扑序,能选即选,那么这么做的话可以保证没选的点可以一步到达。
回到原题,如果我们选一个 DAG 子图来做呢?这样会导致存在两个点都被选了且有一个“返祖边”。
“返祖边”是拓扑序大的连向小的边。注意到,我们可以取出所有矛盾的点,这些点显然构成一个 DAG。那么这个 DAG 我们再次按照(新的)拓扑序来,能不删就不删。那么会导致距离增加 \(1\)。
我们如果删掉其中选了的点会导致由该点出发到达的点的距离变为 \(2\),仍符合条件。
实际我们可以令拓扑序为 \(1\sim n\),然后反过来 \(n\sim 1\) 做一遍矛盾的点即可。
这个题切入点是 DAG 的做法。
CF1610F Mashtali: a Space Oddysey
首先设 \(a_u\) 为连接 \(u\) 的点权和,答案上限是 \(\sum [2\not|a_u]\),并且猜测一定能取到这个上限。
边定向问题考虑欧拉回路,因为欧拉回路定向出来保证入度与出度相同,有优美的性质可以拓展。
建一个虚点向原图度数为奇数的点连边权为 \(1\) 的边,以保证新图中每个点的度数都为偶数。
在新图上直接跑欧拉回路,顺便根据访问的方向给每条边定向。
注意进入一个点时优先选择与入边边权相同的边出去,再选择不同的。
这样的话考虑证明,对于每个 \(2\not |a_u\) 的点,分讨其度数的奇偶性。
若 \(2\not |deg_u\),那么有一条连向虚点的边,此时 \(1,2\) 边的数量都为偶数。
因为我们坚持入边和边尽量相同,这样每条入边和出边能匹配上,减去连向虚点的边即可。
若 \(2|deg_u\),那么 \(1,2\) 边的数量都为奇数,那么会有一个 \(1\) 匹配 \(2\),也是满足条件的。
P9837 汪了个汪
考虑将所有的二元组分类,考虑按照两元素的差分类,那么差为 \(x\) 的有 \(n-x\) 对。
因为第 \(i\) 行有 \(i\) 个,我们那么我们可以将这些二元组按照个数分类放进每行中。
然而这是不行的。因为行不行我们考虑列的构造,即第 \(i\) 列和第 \(i+1\) 列放差为 \(i\) 的二元组。
发现这是可行的。那么我们现在考虑每行的构造,满足第 \(i\) 个与 \(i+1\) 的差为 \(i\)。
不难想到加减交替构造(zig-zag pattern),即 \(x,x+1,x-1,x+2,x-2\dots\),作差是 \(1,2,3,4,\dots\)。
对于每个 \(x\) 都可以形成不同长度的行,将行的长度排序输出即可。
第二种方法考虑归纳构造,首先我们按照奇偶分类观察。先观察奇数。
观察到一个特殊解。从左到右每列依此是:\(12345\),\(1515\),\(432\),\(24\),\(3\)。
注意到形成了大小为 \(n-2\) 的子任务,那么 \(n\) 为奇数的情况就完成了。
而 \(n\) 为偶数我们先做 \(n-1\),最后一类全放 \(n\) 也完成了。
ARC158D Equation
注意到左式和右式的次数相差 \(1\),那么考虑随机化然后调整即可。
设 \(LHS=k\cdot RHS\),那么 \((\frac{x}{k},\frac{y}{k},\frac{z}{k})\) 一定合法。
但是我们要随机出的条件是 \(LHS,RHS>0\),\(x,y,z\) 互不相同。
ARC161E Not Dyed by Majority (Cubic Graph)
又是一道随机化题目。
那么一个符合直觉的结论为随意一个颜色序列有超过一半的概率是无解的。这个结论证明十分困难。
那么,这时候这个问题就变得比较平凡了。考虑如何判断一个颜色序列是否无解。
对于任何一个点的三个邻居必须有两个颜色与其相同,那么形成若一个不同,另外两个必须同的形式。
这是个 2-SAT 形式,如果 2-SAT 无解说明该构造是合法的。
P7998 [WFOI - 01] 猜数(guess)
交互+dp 的形式。我们交互的方案由我们事先的 dp 决定。
我们很显然可以因为区间等价即设 \(dp_{n}\) 表示当前已经确定区间长度为 \(n\) 的答案。
\(dp_{n}=\min_{l\le r}(\frac{1}{r-l+1}+\max(dp_{r-1},dp_{n-l}))\),因为 \(l,r\) 的代价是取 \(\max\),所以 \(dp_{r-1}=dp_{n-l}\) 时最优。
化简为 \(dp_n=\min dp_k+\frac{1}{2k+2-n}\)。我们显然有一个 \(O(n^2)\) 的 dp,进而决策单调性优化。
或者既然已经有决策单调性,那么一个区间内的最佳转移点也是一个区间,可以考虑分块打表处理。
CF835E The penguin's game
类比 1000 瓶药中找一瓶毒药,而鼠喝了毒药不能直接反应这个经典题目,我们考虑二进制分组思想。
考虑先问二进制第 \(i\) 位为 \(1\) 的集合的答案,可以得出两个特殊位置在该位置的值是否相同。\(10\) 次询问。
我们的入手点是至少有一个二进制位两个位置不同,以此做区分。设这是第 \(k\) 位。
我们只需要第 \(k\) 位的 \(0/1\),分别属 \(a_0,a_1\),之后再确定其他位和该位的关系,只需 \(9\) 次询问。
我们再问二进制位第 \(i,k\) 都是 \(1\) 集合的答案,可以得到这两位的关系,于是所有位都被确定就做完了。