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