南外联测 191112 做题总结
Posted eroad
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了南外联测 191112 做题总结相关的知识,希望对你有一定的参考价值。
Game
重述题意:
有这样一个游戏, 这个游戏里有n只怪, 每只怪血量 (a_i)
每次攻击时, 玩家选择一个数(p), 使得
for(int i = p; i <= min(n, k+p-1); i++) {
a[i] -= k+p-i;
}
求最小的k, 使得玩家可以通过m次攻击使得所有(a[i] < 0)
数据范围:
50% data: (n le 10^3)
100% data: (n le 10^6, m le 1e9, a[i] le 1e9)
首先明显 k 具有可二分性。
对于每一个k,操作的方法只有: 对(a_i)数列顺序“施加攻击”。
但是怎么模拟这个操作呢?毕竟每次都区间减等差数列的数据结构 非常高级,而且难写
(当然写好暴力区间减就50分到手 再一次说明写暴力重要性
形式化的讲, 每次攻击(a_i) 需要施加 (l = lceil frac{a_i}{k} ceil) 次攻击, 影响一直波及到 (a_{i+k-1}) 。
考虑差分。 定义 (Delta a_i = a_{i+1} - a_i)
则有: (Delta a_i ' = Delta a_i + l) 。 所以 区间加等差数列等于区间差分加上一个固定的数
而对(forall Delta a_x, i le xle i+k-1), 都有上式成立。 故对每个操作,打上一个“区间减法”标记就可以了。
(其实这个标记的真正含义是二阶差分)
考后总结
- 50分暴力必须要写。 写了可以对拍。
- 二分时注意 解区间开闭性和边界, 二分其实有很多坑的。重点要记住, 二分区间一致是一个 半开半闭 区间。
- 数组未初始化, 调了40分钟(哭哭哭。
- 其实
k = 0
的情况是存在的, 但是不能写进二分的判定里(若是让k = 0
,那么判断时会除以0)- 所以
k=0
情况要特判。
- 所以
Friend
百度地图的实时路况 简化版。
考后感想
特别要注意: 这张图是有重边和自环的。
我没有给边判重,得20分
判重之后, 满分!!
Revenge
重述题意:
有一颗n个点的树, 每个点有一个颜色,总共有c种颜色。求最短的树上路径(一个点最多经过一次),使得路径上每种颜色的点都有。
60% data: (n le 2000)
100% data : (cle 9, n le 20000)
这道题我在考试时想到的思路是这样的(类比求树的直径):
[ egin{align} 动态规划:&f(i,sta) = 以点i为根,经过点集为sta的最短路径长度&&g(i,sta) = 以点i为根,经过点集为sta的次短路径长度 end{align} ]
但是其实这样无法保证最短路径和次短路径不相交 . 保证 不相交 才是最重要的.
但是我却写了这个错误的解法. 所以最后没时间调试, 我没分了.
考后感想
其实, 通过n次(dfs)就可以得到60分.
所以, 一个方法务必想清楚为什么正确!!不能确定正确的话, 先写个暴力.
100分做法:
动态规划: 仔细看, 定义改成了 (f(i,sta) = 以点i为根,经过点集至少为为sta的最短路径长度)
转移时, 可以优化:
[{DP:} egin{align} &ans =min _s f(u, s) + f(v,s')&f(u, s+c_u) = min {f(v, s+c_u) + 1, f(u, s)} end{align}]
复杂度 (O(n*2^n))
注意!!
(f(i, sta)) 中 (sta) 是 至少 经过点集为sta的最短路径长度
这个至少 很重要。 否则, 这道题就需要用(SOSdp), 一种(FWT)的变体来更新ans了。
这里有一篇(SOSdp)的博客: https://blog.csdn.net/weixin_38686780/article/details/100109753
(原汁原味英文版: https://codeforces.com/blog/entry/45223 )
不过现在就先不学了。
怎么处理这个 至少 呢? (不用枚举子集)
再加一个状态转移方程: (f_{u, s} = min { f_{v,s} + 1, f_{u, s}})就可以了。(有点意思!)
这样, 对于任意一条路径, 所有可能的 忽略某些点 的方案都会被统计到。(毕竟“至少” 就是要 忽略某些在路径上的点)
以上是关于南外联测 191112 做题总结的主要内容,如果未能解决你的问题,请参考以下文章