仙人掌联盟 构造题单

仙人掌联盟 构造题单

前言

这部分是对于课件的学(chao)习(xi)。

什么是构造题

通常情况下,我们认为难以转化为任何已知算法来解决,并且具有较高思维难度的题目为构造题。也就是我们要直接得到题目要求的结构。

这类题特殊在答案不会很复杂,但如果之前没有见过类似模型就会无从下手。给出的大概感受是,我们猜出了一个模型,并且这个模型恰好就是对的,但我们并不知道这个模型是怎么来的。

如何思考构造题

大多是构造题有一个重要特点:不同于非构造题通常只想同一个答案或结构,我们要做到某种意义下的最优化,对于构造题,我们只需要给出一个满足条件的答案,不同的思考方式可能只想不同的正确答案。

构造题大多有不唯一答案。我们当然希望找到一个形式极可能简单或尽可能满足更多特殊性质的解。

一个比较重要的思维方式是我们可以师徒自己为解增加一点限制来换取切入点。(当然,也有可能由于添加的现实过紧导致无法得到解。)

实际上,算法竞赛中的构造题,除了极少部分很偏的知识点之外,都可以被拆分为几个核心解决方式。

比较常见的技巧有:

  • 增量构造法。考虑先假设可以构造出大小为 \(f(n)\) 的解,然后再拓展到 \(n\) 的解。
  • 中转构造法。常用于有操作并且操作可逆的题目。如果我们希望由 \(A\) 构造到 \(B\),可以选择中间状态 \(C\) 并构造 \(A \rightarrow C\) 和 \((B \rightarrow C)^{-1}\)。
  • 猜测范围法。对于一些无从下手但要求最大/最小次数的题目,可以考虑猜测答案的范围。
  • 图论建模法。常见模型有欧拉回路和网络流。
  • 分治法。与增量构造较为类似。

题目详解

CF1882E1 Two Permutations (Easy Version)

先考虑只有一个数组,考虑将其排序。既然是要排序,则考虑往插入或交换的方向思考。手玩发现插入极难构造,考虑构造交换 \(x\) 和 \(y\) 两个位置,发现对于任意的 \(x,y\),均可在三步内完成交换,构造是容易的。将两个数组分别排序后,调整至等长并判无解是容易的。

Luogu P16325 【MX-J29-T4】XOR and Swap

直接从 \(p\) 到 \(q\) 的转变是不容易的,注意到操作是可逆的,考虑构造 \(p\) 和 \(q\) 均变换到一个共同的排列 \(A\)。

注意到是排列,于是考虑置换环。先假设对于交换操作没有限制,则套路地考虑对 \(p_y=x\) 的 \(x,y\) 进行交换。然而本题存在 \(p_x \oplus p_y \leq x \oplus y\) 的限制,由于 \(p_y=x\),于是限制转化为 \(p_x \oplus x \leq p_y \oplus y\)。

则优先对于 \(p_x \oplus x\) 最小的 \(x\) 进行操作一定是正确的。

CF1720E Misha and Paintings

设原矩阵中的颜色数量为 \(m\)。

当 \(m \le k\) 时,答案显然为 \(k-m\)。

当 \(m \geq k\) 时。猜测答案 \(\leq 2\)。考虑给出如下的构造(借 luogu 题解的图):

o_261019081525_hdzdrnlh.png (612×567) (cnblogs.com)

于是答案 $ \le 2$ 时容易证明的。于是除了答案是 \(1\) 的部分外其余均为 \(2\)。考虑哪些情况下答案为 \(1\)。

直接做并不好做,考虑拆贡献,从每种颜色入手。考虑枚举矩阵边长 \(len\),然后对于每种颜色,求出该颜色所在矩形范围,进而求出可以包含其的所有矩形。此处可以用二维差分和前缀和维护。处理完之后,枚举所有边长为 \(len\) 的矩阵判断 \(m-cnt=k \lor m-cnt+1=k\) 即可。\(+1\) 是因为该矩阵可以选择额外贡献一种颜色。

CF1270G Subset with Zero Sum

注意到 \(i-n \le a_i \le i-1\),考虑移项得 \(1 \le i-a_i \le n\) 即 \(i -a_i \in[1,n]\)。注意到 \(i\in[1,n]\),考虑将 \(i\) 向 \(i-a_i\) 连边,于是形成基环树森林。对于一个环,另其的点集为 \(S\),则:

\[\sum_{i\in S} i=\sum_{i\in S}(i-a_i) \Rightarrow \sum_{i\in S}a_i=0 \]

取任意环即可。

CF804E The same permutation

首先 \((n \equiv 2 \pmod 4) \lor(n \equiv 3\pmod 4)\) 时一定无解。

考虑 \((n \equiv 0 \pmod 4)\) 的情况。对于每 \(4\) 个数分组,每组数可以 \((a,b),(c,d),(a,c),(b,d),(a,d),(b,c)\) 实现。对于组之间两两操作,具体方式和 \(4\) 个数本质相同。

考虑 \((n \equiv 1 \pmod 4)\) 的情况。将部分 \((x,y)\) 换为 \((x,k),(x,y),(y,k)\) 即可。

posted @ 2026-10-16 15:35  Zctf1088  阅读(24)  评论(0)    收藏  举报