【学习笔记】[BalticOI 2007 Day 1] Ranklist Sorting
论文题(挺考验语文阅读能力的,足足花了我一晚上+一下午)
首先感性地得到两个推论(这是我们后续按顺序 dp 的基础):
- 最有决策中一定是从大往小操作
- 对于数 x 来说,要么在原地不动,要么移动到 x+1 的前一个位置
现在我们修改一下这个操作的定义:
我们不改变没有操作的点的位置,而是 并列放置 。这样的放置对后面 dp 转移方程的推导很有帮助。
我们可以令 f [ x ] [ p 2 ] f[x][p2] f[x][p2] 表示把 x x x 移动到原序列的 p 2 p2 p2 位置且 x + 1 x+1 x+1 到 n n n 都在 p 2 p2 p2 的最小费用。 p o s [ x ] pos[x] pos[x] 表示 x x x 在原序列中位置。
先来考虑 p o s [ x ] < p 2 pos[x]<p2 pos[x]<p2 即往后移动的情况。
我们定义 c ( p , x ) c(p,x) c(p,x) 表示 1 到 p 中小于 x 的位置的个数 + 1。那么 x 的真实位置其实就是 c ( p , x ) c(p,x) c(p,x) 。
有方程 f[x][p2]=f[x+1][p2]+c(p,x)+c(p2,x) (之所以 -1 是因为要移动到 x+1 的前一位)
那么 p o s [ x ] > p 2 pos[x]>p2 pos[x]>p2 呢?
显然可以归到上一种情况,即 f[x][p2]=f[x+1][p2]+c(p,x)+c(p2,x)+(4-3) (注意这里 (4-3) 其实是提前计算的,后面会讲)
下面我们考虑如何计算对未来状态的影响。
还是考虑 图2.7
。这个时候 5 都对未来决策造成了影响(3 的位置变成了 c(5,3)+2),(注意这里其实是 5 对 3 的位置造成了影响,和 4 没有任何关系),换句话说对象应该是 所有
p
<
x
<
p
2
p<x<p2
p<x<p2 且
s
[
x
]
<
i
s[x]<i
s[x]<i 的点,而且对每个 s[x] 的影响恰好为
i
−
s
[
x
]
i-s[x]
i−s[x] 。
综上所述,dp 转移方程为:
- f [ i ] [ j ] = f [ i + 1 ] [ j ] + c ( p o s [ i ] , i ) + c ( j , i ) f[i][j]=f[i+1][j]+c(pos[i],i)+c(j,i) f[i][j]=f[i+1][j]+c(pos[i],i)+c(j,i)
- f [ i ] [ p o s [ i ] ] = min ( f [ i + 1 ] [ j ] + ∑ p o s [ i ] < x < j [ s [ x ] < i ] ( i − s [ x ] ) ∣ j > p o s [ i ] ) f[i][pos[i]]=\min(f[i+1][j]+\sum_{pos[i]<x<j}[s[x]< i](i-s[x])|j>pos[i]) f[i][pos[i]]=min(f[i+1][j]+∑pos[i]<x<j[s[x]<i](i−s[x])∣j>pos[i])
时间复杂度 O ( n 2 ) O(n^2) O(n2) (优秀!)
最后我们写一个 dfs 输出方案即可。
Luogu 唯二 AC 解 (233)
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17530226.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」