ABC277 E~Ex

E:

简单最短路,加一维表示当前是否翻转所有边的状态即可。

Code

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)\)

Code

G:

这题搬到了图上。

依旧考虑设 \(f_{i,j,k},k\in[0,1,2]\) 表示走了 \(i\) 步,在点 \(j\),Level 的 \(k\) 次方的期望值。

转移依旧类似,核心思想依旧是利用期望的线性性,即

\[E[x+1]=E[x]+E[1] \]

\[E[(x+1)^2]=E[x^2]+2E[x]+E[1] \]

按照 \(i\) 从小到大依次更新即可。

时间复杂度 \(\mathcal O((n+m)k)\)

具体细节看代码。

Code

Ex:

这题的弱化版,稍微改几个地方就好了。

Code

posted @ 2022-11-16 18:58  Kobe303  阅读(68)  评论(0编辑  收藏  举报