2026/04/18 模拟赛总结
NOIP 模拟赛第二场
分数:\(20+90+80+0=190\),排名 \(2/12\)。
T1
题目大意:
给定一个 \(n\) 点 \(m\) 边无自环的图,每个点度数最多为 \(3\),求一种染色方案(\(1\) 为白色,\(0\) 为黑色),使得不存在长度为 \(3\) 的链使得经过的每个点颜色相同。
\(n \le 2 \times 10^5,m \le 3 \times 10^5\)
思路分析:
拿到题发现完全不会做。
开始我还以为每个联通块必然会是一条长链加上几条边,然而我很快发现我错了,二叉树就是一个反例。
然后又发现二叉树还可以变异,根节点也可以有三个儿子。
所以普通路径是完全走不动了,想了1h未果,最后写的神秘暴力。
所以我们直接看正解。要想不存在长度为 \(3\) 的同色简单路径,可以怎么样?
很简单,将中间那个结点变色即可。
又中间结点度数最多为 \(3\),所以我们此时这个结点的异色邻居至少会减少 \(1\),所以这次操作显然是不劣的。
所以你就一直找一个有至少两个同色邻居的点,然后替换颜色,达到一定次数后你就可以找到一个可行解了。
for(int i = 1;i <= n * 10;i ++)
{
int pd = i % n + 1,pp = 0;
for(int j = 0;j < ve[pd].size();j ++)pp += ans[ve[pd][j]] == ans[pd];
if(pp > 1)ans[pd] ^= 1;
}
只能说这设计也是很巧妙了,反正我没见过这样的 T1,也想不到。
T2
题目大意:
有一个 \(2 \times n\) 的矩阵 \(a\),\(1 \sim 2n\) 恰好在 \(a\) 中出现一次,每次可以将一个 \(2 \times 2\) 的正方格翻转 \(180^\circ\),问经过若干次操作后能不能变成 \(2 \times n\) 的矩阵 \(b\)(无解输出 \(-1\)),如果能还要输出最少操作次数。
\(n \le 5 \times 10^5\)。
思路分析:
最好做的一道题。
首先不难发现即使翻转 \(180^\circ\) 等价于交换了其中的相邻两列并交换上下两个数。
所以 \(n\) 列的两个数对显然不会改变,改变了就输出 \(-1\)。
又不难发现当且仅当一列的移动次数为奇数次时上下两个数会颠倒,否则不会。如果不满足条件的依然输出 \(-1\)。
这样我们就将两个数组变成了一个数组:每次操作为交换相邻两个数。
这不就变成了逆序对板子题吗。于是重标号,用树状数组维护。
赛后反思:
不难发现我没有满分
因为数组开小了,数的范围可以到 \(10^6\),但我只开了 \(5 \times 10^5\)。
哎,又挂分了。下次注意吧。
此题只有 \(2\) 人满分也是震惊到我了。这题不是挺好想的吗。
T3
题目大意:
你有一个只含 T 和 O 的 \(n \times n\) 的字符矩阵,你需要用若干矩形将所有 T 全部框柱,代价是矩形的长与宽最大值之和,求最小代价。
\(n \le 60\)
思路分析:
这题显然乱搞能拿很多分,不难发现如果数据完全随机最后一定输出 \(n\)。事实上直接输出 \(n\) 都有 \(40+\) 分。
而我还将其拆分成了四个子矩阵相加求得答案,那么就更精确了,于是就变成了乱搞 \(80\)。
赛后再乱搞甚至就 A 了。
不过显然不应讲错解
正解:按照上面的思路,不难发现一个矩阵答案要么直接算,要么拆分成两个子矩阵答案之和。所以设 \(dp_{i,j,k,l}\) 表示左上 \((i,j)\),右下 \((k,l)\) 的矩阵的答案最小值,首先用之前转移的信息求出不分割时的最小值,然后再分割成两个子矩阵进行转移,当然转移顺序应按照矩阵大小顺序进行转移。不难发现转移只有 \(n\) 次,所以复杂度就是 \(\mathcal{O}(n^5)\),但是常数较小可以卡过。
T4 不可做题,所以就不写了,但是暴力分 \(30pts\) 有 \(4\) 个人写了出来,没有拿到,比较可惜。
综上,这场模拟赛难度比上场要简单, \(300 pts\) 是有可能的,需要继续把握住机会,在能拿分的地方尽可能拿分,不挂分,分析透问题的本质。

浙公网安备 33010602011771号