ABC277 E~Ex
E:
简单最短路,加一维表示当前是否翻转所有边的状态即可。
F:
先考虑简化版本,如果 \(\left\{A\right\}\) 中没有 \(0\),如何判定。
重新表述一下条件,令 \(mn_i,mx_i\) 分别表示第 \(i\) 行中的最小值和最大值,则有
- \(mn_1\le mx_1\le mn_2\le mx_2\le\cdots\le mn_n\le mx_n\)
- \(\forall i\in[1,n],\forall j\in[1,m-1],A_{i,j}\le A_{i,j+1}\)
可以发现,交换行不会影响条件 \(2\),交换列不会影响条件 \(1\)。
于是原问题变成了两个独立的问题。
对于问题 \(1\),将每行按照 \(mn\) 从小到大,\(mn\) 相同时 \(mx\) 从小到大排序,然后检查一遍是否合法即可。
对于问题 \(2\),考虑建图,对于两行 \(j,j^{′}\),如果存在一个 \(i\) 满足 \(A_{i,j}\lt A_{i,j^{′}}\),就建一条边 \(j\to j^{′}\),代表最终排完后 \(j\) 列必须在 \(j^{′}\) 列左边。
显然,如果图是一张 DAG,那有解,否则无解。
但是边的数量太多了,显式建图的话还得继续优化。
其实没必要那么麻烦,代码中并没有显式建图,而是直接 sort
,之后再检查是否合法。
直接 sort
应该是假的,Hack 数据:
1 0 3
5 0 3
0 0 0
应该输出 No
,反正我的代码是输出 Yes
的,不知道有没有其他直接 sort
正确性是对的。
考虑建虚点,假设当前某一行形如:
- 列 \(1,2,3,4,5,6\)
- 值 \(1,2,1,3,3,1\)
则建三个虚点,第一个虚点连向 \(1,3,6\),\(1,3,6\) 连向第二个虚点,第二个虚点连向 \(2\),\(2\) 连向第三个虚点,第三个虚点连向 \(4,5\)。
发现点,边的数量都降到了 \(\mathcal O(nm)\) 级别,直接拓扑一遍即可。
简化版本考虑完了,如果有 \(0\) 呢?
其实也一样,原题中是填完 \(0\) 再交换,不难发现等价于交换完再填 \(0\)。
而如果交换完后,矩阵中忽略 \(0\) 后已经满足非严格递增,则一定可以构造出答案。
例如目前 \(\left\{A\right\}=\left\{0,0,2,0,3,4,0,0,4,0,5,0\right\}\),则可以将其填为 \(\left\{1,1,2,2,3,4,4,4,4,4,5,5\right\}\)。
于是可以解决有 \(0\) 的情况,把 \(0\) 忽略掉,用没 \(0\) 的情况来处理即可。
时间复杂度 \(\mathcal O(nm\log nm)\)。
G:
把这题搬到了图上。
依旧考虑设 \(f_{i,j,k},k\in[0,1,2]\) 表示走了 \(i\) 步,在点 \(j\),Level 的 \(k\) 次方的期望值。
转移依旧类似,核心思想依旧是利用期望的线性性,即
按照 \(i\) 从小到大依次更新即可。
时间复杂度 \(\mathcal O((n+m)k)\)。
具体细节看代码。
Ex:
这题的弱化版,稍微改几个地方就好了。