2022.7.28 做题记录

昨天忘发了

UVa1625 Color Length Future 7.0

有两个长度分别为 \(n\)\(m\) 的颜色序列,你需要将它们合并成一个长度为 \(n+m\) 的颜色序列,要求合并后原来颜色序列颜色的相对位置不变。

对于颜色序列 \(S\),定义 \(L(c)\) 为颜色 \(c\) 第一次出现的位置与最后一次出现位置之间的距离。

你需要求出来使得 \(\sum_{c}L(c)\) 最小的可以合并得到的颜色序列。输出最小的 \(\sum_c L(c)\) 即可。

例如,对应颜色序列 \(\text{GBBY}\)\(\text{YRRGB}\),一种最优方式是将其合并为 \(\text{YRRGGBBYB}\),则 \(L(\text{Y})=7,L(\text{R})=1,L(\text{G})=1,L(\text{B})=3\),答案为 \(7+1+1+3=12\)

数据范围:\(1\le n,m\le 5000\),颜色序列中只有大写英文字母。

按照套路我们考虑 DP:设 \(f(i,j)\) 为将两个颜色序列的前 \(i\) 个字符与另一个的前 \(j\) 个字符合并起来的最小花费。

决策有两种,分别是 \(f(i,j)\to f(i+1,j),f(i,j)\to f(i,j+1)\)

但是贡献似乎并不是很好计算......我们并不知道每种颜色具体是在什么时候开始的。

考虑提前计算贡献。可以发现,每次转移时产生的贡献其实就是「已经开始而仍未结束」的颜色个数。

可以发现这有些类似差分:其实就是把每个颜色 \(c\) 看做在第一次出现与最后一次出现之间做一次区间加。

我们对每种颜色做一次区间加就得到了一个前缀中「已经开始而仍未结束」的颜色个数。

于是这题就做完了。复杂度 \(O(nm)\)AC Code

Luogu6995 Knockout Racing Past 4

随机跳题.jpg

由于 \(n,m\le 1000\),我们每次直接暴力枚举所有车,算一下其在 \(t_i\) 时刻的位置即可。AC Code

其实可以用树套树做到 \(n,m\le 10^5\) 吧(没细想qwq)

Luogu1401 城市 Present 6

随机跳题.jpg

二分答案然后跑网络流,看答案是否 \(\ge t\) 即可。复杂度 \(O(\text{maxflow}(n,m)\log V)\)AC Code

posted @ 2022-07-29 22:05  云浅知处  阅读(37)  评论(0编辑  收藏  举报