Loading

模拟赛8.3 解题报告

T1 跑路

题意:一个矩阵,每个数为 \(0/1\)。每次操作选一个子矩阵,把子矩阵中的所有数取反。求使得矩阵出现一条从 \((1,1)\)\((n,m)\) 全为 \(0\) 的最短路径的最小操作数。

对于任意一条 \((1,1)\)\((n,n)\) 的最短路径 \(P\),我们若令 \(P\) 上的数全部变成 \(0\),需要选择若干个矩阵操作。不难发现,此时的最小操作数为 \(P\)\(1\) 的连续段数。

\(f[i,j]\) 表示到达 \((i,j)\)\(1\) 的最小连续段数,\(O(nm)\) 的 DP 即可解决。

T2(AGC010C) 清扫

题意:有一棵 \(n\) 个点的树,每个点 \(u\) 有一个非负权值 \(a_u\)。进行若干次操作,每次操作选择两个叶子节点 \(v_1,v_2\),若对于任意一点 \(u\in \text{Path}(v_1,v_2)\),满足 \(a_u>0\),则令所有 \(a_u(u\in\text{Path}(v_1,v_2))\) 减一。判断是否能使所有权值变成 \(0\)。叶子节点定义为度数为 \(1\) 的点。

抽象题需要大力设数,设 \(g[u]\) 表示 \(u\) 的子树中的叶子节点与 \(u\) 子树外的叶子节点的操作数。

为了方便,我们先找一个非叶子节点作为根(\(n<3\) 时特判)。对于点 \(u\),若我们已知 \(g[v](v\in \text{son}(u))\),设 \(sumg=\sum\limits_{v}g[v],\space mxg=\max\limits_v\{g[v]\}\),若 \(sumg<a_u\),显然无解。否则每个儿子需要互相合并一些操作,共合并 \(sumg-a_u\) 次。根据经典套路,我们最多可以合并 \(\min(\lfloor\frac{sumg}2\rfloor,sumg-mxg)\) 次,判断合法性,然后计算

\[g[u]=sumg-2(sumg-a_u)=2a_u-sumg \]

显然最后根节点的 \(g\)\(0\),再判断一次根节点即可。

T3(ARC092F) 定向

给出一张有向图,对于每条边,判断将其反向后 \(\text{SCC}\) 数量是否改变。

\(n\le1000, m\le2\times10^5\)

对边 \((u,v)\) 分类。

  • \((u,v)\)\(\text{SCC}\) 外的边(连接两个 \(\text{SCC}\) 的边)

\(u\rightarrow v\) 存在另一条路径,那么 \((u,v)\) 反向后,存在环 \(u\sim v\rightarrow u\)\(\text{SCC}\) 数量减一。

  • \((u,v)\)\(\text{SCC}\) 内的边

\((u,v)\) 反向,该 \(\text{SCC}\) 割裂的条件: \(u\rightarrow v\) 不存在其他路径。

于是,边 \((u,v)\) 反向后改变 \(\text{SCC}\) 数量的条件:v→u存在路径 \(\operatorname{xor}\) u→v存在其他路径 \(=1\)

第一项好做,第二项呢?

大力发扬人类智慧,若边 \((u,v)\)\(u\) 的出边中处于位置 \(p\),那么另一条路径包含的 \(u\) 的一条出边肯定在 \(p\) 的前面或后面。于是我们从前往后遍历出边,从后往前便利出边,进行两次 \(\text{Dfs}\)。若两次所占的 \(u\) 的出边有一条不是 \((u,v)\) 那么说明存在其他路径。

时间复杂度 \(O(nm)\)

T4(ARC089F) 染色

题意:\(n\) 个球,\(m\) 次染色操作。给出长为 \(m\)\(\text{r,b}\) 组成的字符串 \(s\),若 \(s_i=\text r\),第 \(i\) 次操作为选择一段区间染红色,否则为选择一段小球都是红色的区间染蓝色。初始时所有小球都是白色的,求染完后小球的颜色情况有多少种可能,模 \(10^9+7\)

非常复杂。

首先每一个非白色极长段肯定是先用红色全染,再用红蓝再上面染。我们以最少染色次数来计数,分成两类:

  • 最终全是红色的大红段

  • 最终有蓝有红的杂色段

先考虑杂色段。我们发现,若蓝色小段一共有 \(k\) 小段,那么我们至少需要 \(k+1\) 次染色,其中一次为一开始的大红段整体染色。而且,第二次染色一定是用蓝色染,剩下的颜色随便。即一个有 \(4\) 个蓝色小段的杂色段,染色序列为 \(\text{rb}\)XXX,任意一种染色序列都能染出所有可行方案。

\(s_i\) 表示第 \(i\) 个杂色段的蓝色小段数量,\(t_i\) 表示 第二次染色的时间从小到大的第 \(i\) 个染色段从第二次染色的时间开始,有多少次染色是没有用过的(“用过”指杂色段的第一次大红染色,以及每个大红段的一次染色)。

若一共有 \(c\) 个杂色段,对于任意一个 \(i(1\le i\le c)\)

\[t_i\ge \sum_{j=i}^c s_j \]

我们把 \(s\) 降序排序,即可令满足条件的可能性最大化。

先不考虑每个段(不管大段还是小段)的长度,如何计数这些杂色段的排列数?显然蓝色小段数量相等的段是一样的,这就是一个多重集排列数,我们可以 DP 做。在 DP 的同时去满足上式条件限制。

\(f[i,j,k]\) 表示填写了 \(s_{i...c}\),其中 \(\sum\limits_{p=i}^c s_p=j,\space\space s_i=k\),此时所有方案的多重集排列数。

枚举 \(x\) 表示 \(s_i=s_{i+1}=\dots=s_{i+x-1}>s_{i+x}\),枚举 \(s_{i+x}=y<k\),那么

\[f[i,j,k]=\sum_{x,y} f[i+x,j-kx,y]\times C(c-i+1,x) \]

这个 DP 是 \(O(n^4\log n)\) 的,前缀和优化可至 \(O(n^3\log n)\)

为了满足条件,有 \(j\le t_i\),对于 \(x'\in [i+1,x]\) 都有 \(j-kx'\le t_{i+x'}\),后者可以在枚举 \(x\) 的时候顺便判断。

现在考虑大红段,设有 \(a\) 个大红段。贪心考虑,可知我们先让杂色段占掉靠前的 \(\text{r}\),让大红段占掉剩下的一些 \(\text{r}\)。然后我们对大红段和杂色段之间计算排列组合方案数:\(C(c+a,c)\)

考虑每个段的长度和白色段的长度。设杂色段的 \(\sum\limits_{i=1}^cs_i=s_0\),对于每个杂色段,若有 \(k\) 个小蓝段,则 \(k\) 个小蓝段和夹在其中的 \(k-1\) 个小红段长度至少为 \(1\),即杂色段有 \(2s_0-c\) 个长度至少为 \(1\) 的段;白色段有 \(a+c-1\) 个段长度至少为 \(1\);大红段有 \(a\) 段。

则长度至少为 \(1\) 的段数:

\[2s_0-c+a+c-1+a=2s_0+2a-1 \]

杂色段两侧的小红段可有可无,整个小球序列的两侧的白色段可有可无,进一步推出所有可能的段数:

\[2s_0+2a+2c+1 \]

然后用插板法就行了。

于是答案为

\[C(c+a,c)\times\sum f[1,j,k]\times C(n-(2j+2a-1)+(2j+2a+2c+1)-1,2j+2a+2c+1-1) \]

最后枚举个 \(a,c\) 即可,时间复杂度 \(O(n^5\log n)\)

posted @ 2023-08-06 19:18  Lgx_Q  阅读(24)  评论(0编辑  收藏  举报