Logo cxm1024 的博客

博客

CFR-745(Div.2) 解题报告

...
cxm1024
2025-12-01 12:52:18
wfyz 太有实力了

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2021-10-08 11:30:11

更好的阅读体验

没打比赛,赛后做出3道。 这场比赛题目质量很高,非常巧妙。

A. CQXYM Count Permutations

$Problem$

求有多少 $2n$ 的排列满足存在超过 $n$ 个 $i$ 使得 $p_i<p_{i+1}$,答案对 $10^9+7$ 取模。

$\sum n\le 10^5$

$Solution$

这题就非常巧妙了,当我们使劲想想不出来时,正难则反,考虑有多少 $2n$ 的排列满足存在超过 $n$ 个 $i$ 使得 $p_i>p_{i+1}$,这时候我们就会发现:这不是一样吗?没错,答案就是 $\frac{(2n)!}{2}$。

B. Diameter of Graph

$Problem$

每次给定 $n,m,k$ 问能不能构造一个 $n$ 个点,$m$ 条边的简单无向图使得图的直径小于 $k-1$。

一张图的直径定义为最短路最长的两个点的最短路长度。

$t\le 10^5,n,m,k\le 10^9$

$Solution$

始终没有明白为什么要“小于 $k-1$”,直接 k-=2 后变成 $\le k$。

考虑这道题可以转化为构造一个 $n$ 个点,$m$ 条边的直径尽可能小的图。

首先判断能否连通,即 $m<n-1$,然后判断是否必须有重边,即 $m>\frac{n(n-1)}{2}$,如果出现这两种情况则为不合法,直接排除。而且,如果 $k<1$,也直接排除,因为不可能存在两个点的距离 $<1$。

然后考虑能否构造出直径为 $1$ 的图。我们发现只有完全图的直径为 $1$,因为任意两个点都可以直径过 $1$ 条边到达。所以,如果 $k=1$,只有完全图才成立,否则不成立。接着在考虑能否构造出直径为 $2$ 的图。我们会发现只要图连通,就一定能构造出来直径为 $2$ 的图,因为菊花图的直径为 $2$,而在菊花图上加边不会让直径变大,所以只要 $k>1$ 就一定能构造出来。

C. Portal

$Problem$

给定一张 $n\times m$ 的矩阵,每个格子有空和黑曜石两种状态,你可以花费一步操作将空格子变成黑曜石或将黑曜石变成空格子。一个子矩阵可以形成传送门需要具备以下条件:

  1. 高度 $\ge 5$,宽度 $\ge 4$。注意,传送门不能横过来看,宽就是宽,高就是高。
  2. 中间部分必须全是空格子。
  3. 四周边框必须全是黑曜石。
  4. 四角不限。

问至少需要几次操作才能搭建一个传送门。

$\sum n\le 400,\sum m\le 400$

$Solution$

这道题我从9月30号读题一直到10月8号才做出来,历尽了千辛万苦。

记输入的矩阵为 $a$,用 $0$ 表示空格,$1$ 表示黑曜石。

首先预处理出每一行的前缀和,以便我们 $O(1)$ 查询一段横向区间里有多少块黑曜石,我们用 $s[i][j]$ 表示。

然后,枚举合法的左右边界($r-l\ge 3$),我们记 $len=r-l-1$ 表示中间部分的宽度,对于每一个左右边界,记 $t[i]$ 表示前 $i$ 行全变成 $100...001$ 的格式需要花费的步数,本质上是竖向的前缀和:$t[i]=t[i-1]+(s[i][r-1]-s[i][l])+(2-a[i][l]-a[i][r])$。然后我们考虑如何 $O(1)$ 计算搭建一段以 $u$ 为上边界,$d$ 为下边界的传送门的步数:首先让中间和左右边框合法($t[d-1]-t[u]$),再让上边框合法($len-(s[u][r-1]-s[u][l])$),同理再让下边框合法($len-(s[d][r-1]-s[u][l])$)。加起来,则为:

$t[d-1]-t[u]+(len-(s[d][r-1]-s[d][l]))+(len-(s[u][r-1]-s[u][l]))$

将与 $u,d$ 有关的项分开,方便处理:

$2len+(t[d-1]-s[d][r-1]+s[d][l])-(t[u]+s[u][r-1]-s[u][l])$

我们记 $f[i]=t[i-1]-s[i][r-1]+s[i][l],g[i]=t[i]+s[i][r-1]-s[i][l]$,则上式可简化为 $2len+f[d]-g[u]$。

现在考虑从上到下扫下边界,对于每一个下边界,我们要使步数尽可能小,即让 $2len+f[d]-g[u]$ 尽可能小,就要让 $g[u]$ 尽可能大,于是我们从上到下扫的时候,记录以下当前扫过的 $g[u]$ 的最大值 $maxn[i]=\max(maxn[i-1],g[i])$,那么对于每一个下边界 $d$,最小步数就为 $2len+f[d]-maxn[d-4]$,整个算法的时间复杂度就可以做到 $O(m^2n)$。

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。