代码源构造专题

构造专题

CF2025F

如果要在一个点上操作很多次,可以正负交替使得最终只和操作次数的奇偶性相关。换言之就是 \(x_i,y_i\) 连边,记点 \(u\) 分配到 \(d_u\) 个点那么权值就是 \(d_u \bmod 2\)。

此时一个连通块的答案下界显然是 \(\left(\sum_{v \in C} d_v\right) \bmod 2\),构造方案是经典的生成树构造:任取连通块的一棵 DFS 生成树,从下往上调整,对每个点通过异或自己的权值的操作,必定能将所有子节点调成 \(0\)。那么这样必定达到下界,否则任意重定根时可以将所有奇数度数调到现在的根那么必定不劣于重定根的答案,矛盾了。时间复杂度 \(\mathcal{O}(n)\)。


CF2045L

硬调整题,感觉其实和 QOJ1837 某种意义上是类似物。

因为点和边都是 \(\mathcal{O}(\sqrt{k})\) 级别的,所以首先要解决的是用 \(n\) 个点构造出 \(n^2\) 大小的答案,再考虑恰好 \(k\) 的事。

令 \(u\) 入栈次数为 \(c_u\),度数为 \(d_u\),那么实际上 \(k = \sum_{u=1}^{n} c_u \times d_u\)。

考虑先构造一个环,因为有类似 \((u, u \bmod n + 1)\) 状物的存在所以遍历顺序是 \(1, n, n-1, n-2, \dots, 2\) 状物。所以此时如果增加反边 \((u, v)\),其中 \(2 \leq u \lt v - 1 \lt n\) 状物,则必定会令 \(d_u, d_v\) 度数 \(+1\) 并令 \(c_u \leftarrow c_u + 1\)。

然后此时让所有 \(n \neq 2\) 向 \(2\) 连边,此时 \(c_2, d_2\) 都是 \(\mathcal{O}(n)\),所以答案就变成了 \(\mathcal{O}(n^2)\) 量级。再考虑调整到恰好 \(k\):

  • 连接 \((1, n - 1)\) 可以答案 \(+5\)。
  • 连接另外的 \((1, u)\) 可以答案 \(+2\)。
  • 考虑进一步增量构造,先用 \(\mathcal{O}(n)\) 条边让答案只剩下 \(\mathcal{O}(n)\) 而不是 \(\mathcal{O}(n^2)\),然后再用 \(\mathcal{O}(\sqrt{n})\) 条边去掉小于此时 \(k\) 的 \(\mathcal{O}(n)\) 个限制使其变成 \(\mathcal{O}(\sqrt{n})\) 状物,这样剩下 \(\mathcal{O}(1)\) 的时候就可以用上面两个操作。

时间复杂度 \(\mathcal{O}(\sqrt{k})\)。


AGC030C

首先对于 \(k \leq 500\) 的情况直接每行填一样的数,第 \(i\) 行填 \(i\) 即可。

对于 \(k \gt 500\),因为 \(k\) 至多是 \(2n\) 量级,和对角线的量级一致,所以自然地往对角线上考虑。

我们注意到,构造满足条件的解,实际上是对邻域做划分,然后确保每个位置的邻域的等价类大小和取值都是一样的。

本质上横行相当于是 \((i + 1, j), (i - 1, j)\) 一组,然后 \((i, j - 1), (i, j + 1)\) 默认相同。

那么可以考虑让 \((i + 1, j), (i, j + 1)\) 一组,\((i - 1, j), (i, j - 1)\) 一组,这样等价于斜着填对角线,一个 \(4 \times 4\) 的例子是:

1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3

那么实际上你注意到因为循环移位的原因,我们此时可以将 \((i + 1, j), (i, j + 1)\) 也拆开,\((i - 1, j), (i, j - 1)\) 同理,只需要保证这四个位置是两两不同的,也即不存在任何一个大小 \(\geq 2\) 的等价类,并且由循环移位的性质我们知道同一条对角线上至多有两个取值交替出现。一个例子是令 \(c_{i,j} = (i + j) \bmod n\),然后交替 \(c_{i,j}\) 和 \(c_{i,j} + n\):

1 2 3 4
6 7 8 5
3 4 1 2
8 5 6 7

这样即可给出 \(2n\) 量级的所有构造,时间复杂度 \(\mathcal{O}(n^2)\)。


CF2124I

一个基本的观察是 \(f(p)\) 必定是唯一的,字典序定义不难说明。

首先我们考虑这个贪心限制,给定一个序列 \(p\) 我们如何求出 \(f(p)\)。

因为是字典序最大所以肯定要逐位考虑,对当前这一位,设起点是 \(p_1\),那么一个显然的思路是直接令 \(b_1 = p_1\),因为 \(p_1\) 必定要放在第一段,所以极限情况是 \(p_1\) 为第一段所有元素最小值,答案不可能大于 \(p_1\)。

然后我们考虑还有哪些位置可以和 \(p_1\) 一段。我们找到最小的 \(i\) 使得 \(p_i \lt p_1\),如果它放第一段肯定是不优的,因为此时第一段取到 \(p_i\) 了,而字典序意义下第一段需要尽可能大,所以把它放到后面某段必定是不劣的,因此第一段的右端点必定小于 \(i\)。

如果此时 \(i = 2\),那么直接第一段一个元素 \(p_1\),然后问题归纳到 \([2,n]\) 作为整个序列的情形,递归处理下去即可。

如果 \(i \gt 2\),为了让第二段尽可能大,我们找到 \([1,i - 1]\) 内的最大值 \(p_j\),那么 \(p_j\) 必定不能与 \(p_1\) 一段,因为此时第一段的取值已经卡到上界了,这样对最大化第二个位置的目标必定是不优的。而将 \([1,j - 1]\) 内的元素放进第二段无疑会使得 \(p_j\) 无效化,因此第一段的区间就是 \([1,j - 1]\),然后递归到 \([j, n]\) 的子问题。

这样我们得到了一个利用 \(p\) 求出 \(f(p)\) 的做法,再考虑如何解决原问题。

假设当前处理到 \(x_i = k\),令 \(j\) 是最大的使得 \(x_j = k - 1\) 的位置,那么划分必定是 \(j\) 对应子区间的右端点不超过 \(i - 1\),然后 \(i\) 属于下一个子段。换言之 \(j\) 恰好是上一次递归的末尾。考察每次递归过程,会发现对每个位置,至多有一个来自前面的位置对应的下一步递归点位于 \(i\),而 \(i\) 可以对应后续若干点,因此整个递归流程形成一棵树,\(x\) 就是深度序列。对于这棵树,有一些观察:

  • 若 \(x_i - x_{i - 1} \gt 1\),因为极小的情况是一个元素划分一段,这样必定是无解的。
  • 若 \(i - j \gt 1\),首先由贪心过程可知,如果 \(j\) 是上一段最后一个元素,相当于 \(j + 1\) 是贪心过程的那个 local max,而在这之后加进去的每一个数必定 \(\geq p_{j + 1}\),这样才能令 \(b_{k}\) 尽可能大,否则先确保 \(b_k\) 最大,再在后面单独分段必定不劣,由此我们知道了 \(p_{j + 1},p_{j + 2},\dots,p_{i}\) 均大于 \(p_j\) 并且 \(p_i\) 是这一段的最大值。
  • 进一步推广第二点,因为 \(p_i,p_{j + 1}\) 同段,所以这段的策略必定是不能加入 \(\lt p_{j + 1}\) 的数,否则只会让更前面的位置更小,是不优于直接分段把小的数隔到后面去的,因此我们发现 \(p_{j + 1} \lt \dots \lt p_i\) 必定是成立的,换言之如果一个点 \(j\) 存在大于一个子节点,那么该子节点不能有大于一个子节点,即 \(j\) 的每个一级子节点出度均为 \(1\),否则对于某个一级子节点和任意两个二级子节点,偏序关系仍成立,则这两个二级子节点至少有一个可以放到和一级子节点深度相同的层上,换言之给出的 \(x\) 指示的树并不是最优的。

因此可以直接将这个递归顺序,按照上面说的 \(i,j\) 的相对大小建出来,容易发现一棵子树必定对应一个连续的区间,那么每次递归等价于,给定一段值域上的区间 \([l_1,r_1]\) 和一段位置区间 \([l_2,r_2]\),要你把值填进去:

  • 如果当前点是叶子节点,直接填即可。
  • 如果此时的 \(l_2\),也即上面的 \(j\) 只有一个子节点,那么不存在对 \(a_{l_2},a_{l_2+1}\) 的大小关系的要求,所以为了不让后续出现无解情况,直接令 \(a_{l_2} = r\),这样必不可能出现因为 \(a_{l_2 + 1} \lt a_{l_2 + 2}\) 这种情况导致的无解。
  • 如果此时的 \(l_2\) 有多个子节点,因为按照上面的分析,一级子节点要么是出度为 \(1\) 的点,要么是叶子,所以可以直接令 \(a_{l_2} = l\),然后将 \([l_1 + 1, r_1]\) 按照位置从小到大分给所有子节点,并且按照上面的一个子节点的分析,必定是将每个子节点对应子树值域的最大值分给这个子树的根。

这样可以直接一遍 DFS 求解,时间复杂度 \(\mathcal{O}(n)\)。


AGC025D

我觉得这种题需要人类一些的思路。

首先注意到问题是在 \(4n^2\) 个可行点中选取一个大小至少为 \(n^2\) 的,满足某种限制的集合,类似于 CF2207G 的思路,我们想到大概率是想办法构造一种方法,使得可以找到 \(4\) 个大小之和为 \(4n^2\) 且不交的满足条件的集合(就是不交的,并起来为可选点集全集的集合),然后选取其中最大的一个集合即为所求。

然后又因为本质上有 \(2\) 类点之间的距离限制,所以可以想到 \(4 = 2 \times 2\),即对每类 \(D\) 分别得出某种可以 2-划分 的构造,然后两个距离限制之间没有额外限制,这样每个点可以被唯一分进四类中的一类。

那么此时再来考虑单一的 \(D\) 的限制,令两点分别为 \((x_i,y_i),(x_j,y_j)\),那么距离是 \((x_i-x_j)^2+(y_i-y_j)^2=D\),因为坐标都是整数,所以根据小奥常识我们知道 \((4k+1)^2 \equiv (4k+3)^2 \equiv 1 \pmod 4\),偶数同理。因此横纵坐标上的贡献是 \(0/1\),这个明显就是 \((i + j) \bmod 2\) 状物的分类规则,因此整张图是可以被 2-染色的,这个构造方案满足上面说的约束,因此将所有 \((x_i - x_j)^2+ (y_i - y_j)^2 = D_1\) 的点对在 \(G_1\) 中连边,同时将所有 \((x_i - x_j)^2 + (y_i - y_j)^2 = D_2\) 的点对在 \(G_2\) 中连边,由上面条件我们知道 \(G_1,G_2\) 分别是二分图,因此每个点在 \(G_1, G_2\) 中所属的集合可以将所有点不重不漏地分为四个集合,则只需要选取其中最大的集合。

直接按照规则隐式连边,一开始仅处理左上角 \((D - 1) \times (D - 1)\) 大小区域内的起点是 \(\mathcal{O}(n^2)\) 的,我比较唐写了一个 \(\mathcal{O}(n^2\sqrt{D})\) 的枚举做法,不过都能过。


posted @ 2026-09-28 12:23  Twistedmind  阅读(7)  评论(0)    收藏  举报