模拟赛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\) 为 \(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)\)
我们把 \(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\),那么
这个 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\) 的段数:
杂色段两侧的小红段可有可无,整个小球序列的两侧的白色段可有可无,进一步推出所有可能的段数:
然后用插板法就行了。
于是答案为
最后枚举个 \(a,c\) 即可,时间复杂度 \(O(n^5\log n)\)。