基本模型

以下是一些图上的问题,我们的基本思路是构造出一种合法情况,然后进行旋转/对称。

图有点难看了,手画的,没有工具。。。

这又称为“zig-zag pattern”(之字形划分?)。

#1

把一个 nn 个点(nn 是偶数)的完全图分成 n2\frac{n}{2} 条哈密顿路。

这个就是直接构造一条哈密顿路,然后进行旋转,就可以不重不漏了。

#2

把一个 nn 个点(nn 是奇数)的完全图分成 n−12\frac{n-1}{2} 条哈密顿路。

我们需要考虑把奇转化为偶,于是在中间加一个点。

#3

把一个 nn 个点 (nn 是偶数) 的完全图分成 n−1n-1 个匹配。

也是中间加一个点,构造出可以旋转的反感。

#4

把一个 nn 个点的完全图的所有边排成一个圈,使得任意连续的 n−1n-1 条边都构成一棵树。

按照第一种方法,加一条删一条保证是树。


这些模型很多做题的时候都可以用。

直接构造

P9837 汪了个汪

P9837 汪了个汪。

可以直接利用上面的模型。我们先要想办法转化成上面的图论问题。

构造方法

我们发现这道题两种颜色相邻的不能重复连边就相当于我们的第一个模型,完全图两条边直接只有一条边。

于是发扬一下人类智慧。

先考虑偶数:我们把最后一行拼到第一行,倒数第二行拼到第二行...然后就成为了 n2\frac{n}{2} 个链条,直接当成哈密顿路径做。每个链条长度 n+1n+1,中间那个点重复用。

对于奇数:我们需要转化成偶数,于是就加一个 00 号节点,我们发现 00 号节会在第 1,2,⋯n+121,2,\cdots \frac{n+1}{2} 个位置出现,然后每一个链条就割掉这个 00 号节点就行了。

细节挺多的。

P16357 [BalticOI 2026] Blocks

P16357 [BalticOI 2026] Blocks。

先分奇偶讨论,然后再找各种性质。

思路
  • 对于 nn 是偶数,平均数的分母一定是 22,但是如果一个颜色出现了奇数次就不可能了,所以只需要判断每个颜色出现次数是否是偶数次。

  • 对于 nn 是奇数,我们先把颜色数量是偶数的排除掉,然后数量是奇数的个数如果是奇数,就先放一个到中间,剩下的进行“配对”。怎么让其恰好配对?

我们进行尝试,先划分区间,划分成四段,每段长 len=mid×12len=mid\times\frac{1}{2},然后中间点记为 midmid,划分方法就是一个颜色 [mid+i,mid+len+i,mid−len−i∗2][mid+i,mid+len+i,mid-len-i*2],[mid−i,mid−len−i,mid+len+i∗2][mid-i,mid-len-i,mid+len+i*2]。

发现这样刚刚好。难写!换成题解的写法就过了?因为我的写法。。。

P12572 [UOI 2023] An Array and Addition Again

P12572 [UOI 2023] An Array and Addition Again。

我们发现一个操作可以把一个数翻倍,也可以加上另一个数,所以我们尝试倒推来做。

思路

如果当前 nn 为奇数,就需要从 +1+1 转移,否则就是从 ∗2*2 转移。

我们先把所有的弄成 +1+1。

AT_arc172_d [ARC172D] Distance Ranking

AT_arc172_d [ARC172D] Distance Ranking。

真的真的很无语,出题人求导多了吗?这么喜欢微元!

我们给特定的点进行轻微扰动,只会影响特定的节点。

思路

我们发现有 nn 维,于是每一个数初始有一个维度为 +∞=inf+\infty=inf。

现在两个数的距离就是 2inf\sqrt {2} inf。

我们想调整两个数的距离但是保证其余数的大小关系不变。

我们调整一个数在另一个数的坐标,调整 ww,于是:inf2+(inf−w)2=2inf2+2infw−w2→2inf2−2infwinf^2+(inf-w)^2 = 2inf^2+2infw-w^2 \to 2inf^2-2infw(忽略 w2w^2 这种小量),对于其他数:w2w^2 直接忽略。

于是我们只需要枚举限制然后减少 ww。

#4217. Graph Coloring

#4217. Graph Coloring。

如果运气好可以猜到 C147≥3000C_{14}^7\ge 3000。。。很无语,什么人类智慧啊!

如果猜不到,呢就只能一步步分析了。

思路

设一个点出边的颜色点集为 sis_i,我们发现如果 i→ji\to j,那么如果 sjs_j 不能包含 sis_i。

为了保证这个限制,我们可以让每一个点的点集都不同,结合 C147≥3000C_{14}^7\ge 3000 刚刚好。

P3561 [POI 2017] Turysta

P3561 [POI 2017] Turysta。

当时做图论的时候做过,人类智慧。

大概是寻找竞赛图的性质,发现 dfs 序倒序遍历一定存在边。

#810. 【UNR #7】比特迷宫

#810. 【UNR #7】比特迷宫。

相当于可以在 aa 的一段中加上一个序列,这个序列拥有杨辉三角的奇偶性。

组合数的奇偶性可以拿 Lucas 求。。。 神秘 trick。

思路

这个奇偶性有什么规律?画图我们只能发现 11 的个数是 __builtin_popcount(n-1)。

问一下 DPSK。

我们先把杨辉三角转成组合数,然后我们需要尝试去求组合数 (nk)\binom{n}{k} 的奇偶性。

(nk)=n!k!×(n−k)!\binom{n}{k} = \frac{n!}{k!\times (n-k)!}

我们想到了 Lucas 定理,当 pp 是质数时:

Cnm≡C⌊n/p⌋⌊m/p⌋⋅Cn mod pm mod p(modp)C_{n}^{m}\equiv C_{\lfloor n/p \rfloor}^{\lfloor m/p \rfloor}\cdot C_{n \bmod p}^{m \bmod p} \pmod p

我们现在 p=2p=2,递归进行求解(按照二进制拆分),然后就变成了:

$

\binom{n}{m} \equiv \prod_{i=0} \binom{n_i}{m_i} \pmod{2} $

再加上 (00)=1, (10)=1, (11)=1, (01)=0\binom{0}{0}=1,\ \binom{1}{0}=1,\ \binom{1}{1}=1,\ \binom{0}{1}=0。

因此: (nk) 是奇数  ⟺  对于每一位 i, ki≤ni (即 k&(∼n)=0)\binom{n}{k} \text{ 是奇数} \iff \text{对于每一位 } i,\ k_i \le n_i \ (\text{即 } k \& (\sim n) = 0)


其实至此就可以乱搞过题了。

调整法

#16009. Joyful Guided Tour

#16009. Joyful Guided Tour。

直接用队列存可能修改的点,一直调整就行了。我们判断如果当前点不合法,就修改颜色。

复杂度证明:我们用势能分析,每一次操作至少减少两条同色变,至多增加一条。所以至少减少一条,这样分析复杂度就是对的。

AT_agc061_d [AGC061D] Almost Multiplication Table

AT_agc061_d [AGC061D] Almost Multiplication Table。

二分答案+构造可行解。

利用一个思想就是题目如果有两个变量令一个大于另一个,可以进行分类讨论。

思路

我们先进行二分答案,判断这个 midmid 能不能被构造。我们计算每一个 ai,ja_{i,j} 可以的范围 li,j→ri,jl_{i,j}\to r_{i,j}。

观察到 nn 和 mm 很小,所以我们尝试循环构造,进行调整。

我们先假设 xn≤ymx_n\le y_m(分情况讨论,之后再反过来),这样能保证小的那一个在根号级别。

  • 从前往后调整 xix_i,如果比 ≤xi−1\le x_{i-1} 就变成 xi−1+1x_{i-1}+1,然后和每一个 ⌈li,jyj⌉\lceil \frac{l_{i,j}}{y_j} \rceil 取 max⁡\max。

  • 从后往前调整 yiy_i,如果比 ≥yi+1\ge y_{i+1} 就变成 yi+1−1y_{i+1}-1,然后和每一个 ⌈ri,jxj⌉\lceil \frac{r_{i,j}}{x_j} \rceil 取 min⁡\min。

合法或无解就可以结束了。怎么证明正确性?

首先 xi≤infx_i\le \sqrt{inf},所以 xix_i 增加的次数 ≤inf\le \sqrt{inf},yy 减少的次数 ≤inf\le \sqrt{inf}。

代码中由于 n,mn,m 不同,所以需要交换 x,yx,y 在做一次。

注意二分过程中最后一次调用的 check 可能失败,必须用最终答案 l 再调用一次 check 来获取正确的构造。

注意细节,特别是复制代码的时候忘改的地方。

构造上下界

CF1685C Bring Balance

CF1685C Bring Balance。

如果这是 ccf 的考试,看大样例大概率能看出性质。

括号匹配问题先转化成前缀和。

然后分析问题可以画图,就画前缀和的折线图,然后分析翻转有什么影响。

思路

合法的序列需要是每一个前缀和都大于等于 00 的。

翻转一个区间之后最低的点一定是原来最高的点,所以我们只需要让原来最高的点翻转过后不小于 00。

然后充分发扬人类智慧,对于最高的点 xx,翻转 [1,x],[x+1,2n][1,x],[x+1,2n] 一定合法,所以最多需要两次。那还有没有一次的情况呢?

设需要翻转 l,rl,r。我们考虑 L,RL,R 表示最左边和最右边的负数,然后我们从 [1,L][1,L] 和 [R,2n][R,2n] 选 l,rl,r。我们需要保证对于每一个 ii,sl−1+sr−si≥0s_{l-1}+s_r-s_i \ge 0,于是可以贪心,分别选择 [1,L−1][1,L-1] 和 [R,2n][R,2n] 中最大的两个端点作为 l,rl,r,然后判断这样选合不合法。

理论分析

CF1667C Half Queen Cover

CF1667C Half Queen Cover。

我们设放 kk 个棋子可行,然后找出理论答案,再进行构造。

💻代码

我们如果已经放了 kk 个棋子,那么已经有 kk 行 kk 列被覆盖了,我们需要让对角线也被覆盖。

我们还剩下 (n−k)×(n−k)(n-k)\times(n-k) 个格子,所以我们还需要 2∗n−2∗k−12*n-2*k-1 条对角线。

所以 k≥⌈2n−13⌉k\ge \lceil\frac{2n-1}{3}\rceil。我们需要进行构造。

我们的方法:

C++
**.*****
*.******
.*******
****.***
***.****
*****---
*****---
*****---

像这样就行了,我们保证了除了那个矩阵每行每列都有点,并且这个矩阵都有斜着的线覆盖。

P3557 [POI 2013] GRA-Tower Defense Game

P3557 [POI 2013] GRA-Tower Defense Game。

很难评。。。

观察到如果选的点不属于原来的 pip_i 那么也不会更劣,因为选了他一定有 pip_i 的效果。

所以随便选。

P5361 [SDOI2019] 热闹的聚会与尴尬的聚会

P5361 [SDOI2019] 热闹的聚会与尴尬的聚会。

看完题之后有点懵,让子图度数最小的点度数最大和求最大独立集。

虽然最大独立集是 npc,但是这道题并没有要求求最大。

代码

让子图度数最小的点度数最大,这个好做,从原图每次删掉一个度数最小的点就行了,保留中间的最大答案就可以了。

最大独立集怎么办?我们好像没法求。于是我们需要利用这道题的限制,我们考虑用上一个问题的求法来求(好人类智慧啊)。

我们每一次找到度数最小的点,放进独立集,然后把与之相连的点删掉。怎么证明这样是对的?

我们发现每次选择的点的删掉的点数一定不超过 pp(不然剩下的那个东西就比第一个问题的答案优了),所以 q≥⌊np+1⌋ ⁣q\ge\left\lfloor \frac{n}{p+1} \right\rfloor\! 。

配合动态规划

P10786 [NOI2024] 百万富翁

P10786 [NOI2024] 百万富翁。

--

测试点一不用说了。

测试点 22 中 n=1e6n=1e6,需要给出 10999441099944 次查询找到当前最大的数,保证集合元素互不相同。可以分 TT 次给出,T=8T=8。


感觉这道题可以说是一点思路都没有,这个思维题是真的难想。

我们在构造很困难的情况下去尝试 dp,很多时候 dp 过程中是可以获得答案的。

设 fi,jf_{i,j} 表示有 ii 个数,可以给出 kk 次大询问(ask),最少需要询问多少次。

fi,j=fk,j−1+cost(i,k)f_{i,j}=f_{k,j-1}+cost(i,k)


cost(i,k)cost(i,k) 表示将 ii 个数缩减成 kk 个数的代价。我们先考虑 costcost 怎么快速求出来。

我们发现我们很好做 n2\frac{n}{2} 的情况,就是分成 n2\frac{n}{2} 个集合,然后每一个集合比较出最大的,所以这个思路我们可以推广。

我们把 ii 个数分成 kk 组,每组求出最大值,所以答案就是:

令 x=⌊ik⌋,y=imod  kx=\lfloor \frac{i}{k}\rfloor, y=i \mod k。

y×(x+12)+(k−y)×(x2)y\times\binom{x+1}{2} + (k-y) \times \binom{x}{2}


现在我们回到动态规划,这个复杂度是 n2Tn^2T 的,不行。

然后又是人类智慧,我们发现这个决策点前面几个都是 n2\frac{n}{2},其余的暴力计算就行了,因为这是提交答案题哈哈。

其他优化

P12569 [UOI 2023] An Array and Partial Sums

P12569 [UOI 2023] An Array and Partial Sums。

这种题的常见思路:证明答案很小,然后分类讨论

思路

我们先要证明答案很小。考虑进行构造。

我们发现答案一定 ≤3\le 3,感觉跟CF1685C Bring Balance有点像。33 次中一次翻转,一次前缀,一次后缀。

0

直接判断非负。

1

  • 判断全负。

  • 暴力前缀/后缀。


首先需要对其做前缀和的一定是那种前缀和之后全 ≥0\ge 0 的那种。