ABC277 E~Ex
E:
简单最短路,加一维表示当前是否翻转所有边的状态即可。
F:
先考虑简化版本,如果 {A} 中没有 0,如何判定。
重新表述一下条件,令 mni,mxi 分别表示第 i 行中的最小值和最大值,则有
- mn1≤mx1≤mn2≤mx2≤⋯≤mnn≤mxn
- ∀i∈[1,n],∀j∈[1,m−1],Ai,j≤Ai,j+1
可以发现,交换行不会影响条件 2,交换列不会影响条件 1。
于是原问题变成了两个独立的问题。
对于问题 1,将每行按照 mn 从小到大,mn 相同时 mx 从小到大排序,然后检查一遍是否合法即可。
对于问题 2,考虑建图,对于两行 j,j′,如果存在一个 i 满足 Ai,j<Ai,j′,就建一条边 j→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。
发现点,边的数量都降到了 O(nm) 级别,直接拓扑一遍即可。
简化版本考虑完了,如果有 0 呢?
其实也一样,原题中是填完 0 再交换,不难发现等价于交换完再填 0。
而如果交换完后,矩阵中忽略 0 后已经满足非严格递增,则一定可以构造出答案。
例如目前 {A}={0,0,2,0,3,4,0,0,4,0,5,0},则可以将其填为 {1,1,2,2,3,4,4,4,4,4,5,5}。
于是可以解决有 0 的情况,把 0 忽略掉,用没 0 的情况来处理即可。
时间复杂度 O(nmlognm)。
G:
把这题搬到了图上。
依旧考虑设 fi,j,k,k∈[0,1,2] 表示走了 i 步,在点 j,Level 的 k 次方的期望值。
转移依旧类似,核心思想依旧是利用期望的线性性,即
按照 i 从小到大依次更新即可。
时间复杂度 O((n+m)k)。
具体细节看代码。
Ex:
这题的弱化版,稍微改几个地方就好了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话