SRM659 1100pts
绍一模拟赛的题
【问题描述】
小Z、小Y和小B拥有𝑛$\leqslant 2000$个城市,编号0 . . . 𝑛 − 1。对于每一个𝑖(0 ≤ 𝑖 ≤𝑛 − 2),城市𝑖 + 1和城市𝑒𝑑𝑔𝑒𝑠[𝑖]之间存在一条耗时为1的边。这𝑛个城市的
连边构成了一棵树。
现在他们决定选两个城市并建造传送门(可以是同一个城市),当你在一个有传送门的城市时,你可以瞬间移动到另一个有传送门的城市。定义𝑑𝑖𝑠(𝑖, 𝑗)表示建立传送门后从城市𝑖到城市𝑗花费的最少时间。求满足𝑀𝑎𝑥{𝑑𝑖𝑠(𝑖, 𝑗)}(0 ≤ 𝑖, 𝑗 < 𝑛) ≤ 𝑘 的建造传送门的不同方案数。((𝑎, 𝑏)和(𝑏, 𝑎)被视为同一种方案)
【分析】
2000的数据范围允许我们枚举所有点对来统计答案,对于枚举两个点,将其中一个提为根会方便我们统计。
原题解写的很清楚,直接引用。
【题解】
可以先枚举第一个传送门所在的城市𝑥,并以𝑥为根建树。枚举第二个传送门所在位置𝑎,定义𝑎到𝑥的链为主链。定义在主链上的点𝑖的权值𝑣𝑎𝑙𝑖为从𝑖出发不经过主链上的点能到点的最大距离。显然,要满足𝑣𝑎𝑙𝑖 +𝑣𝑎𝑙𝑗 +𝑚𝑖𝑛(𝑑𝑒𝑝𝑖 −𝑑𝑒𝑝𝑗 , 𝑑𝑒𝑝𝑎 −𝑑𝑒𝑝𝑖 +𝑑𝑒𝑝𝑗 −𝑑𝑒𝑝𝑥) ≤ 𝑘(𝑖, 𝑗在主链上且𝑑𝑒𝑝𝑖 > 𝑑𝑒𝑝𝑗)且不经过传送门的点对的距离≤ 𝑘。第二个限制很好处理,考虑第一个限制,如果𝑣𝑎𝑙𝑖+𝑣𝑎𝑙𝑗+𝑑𝑒𝑝𝑖−𝑑𝑒𝑝𝑗 ≤ 𝑘,那么就不需要用到传送门。否则,就要满足𝑣𝑎𝑙𝑖 + 𝑣𝑎𝑙𝑗 + 𝑑𝑒𝑝𝑎 − 𝑑𝑒𝑝𝑖 + 𝑑𝑒𝑝𝑗 − 𝑑𝑒𝑝𝑥) ≤ 𝑘。移项得𝑑𝑒𝑝𝑎 ≤ 𝑘 + 𝑑𝑒𝑝𝑥 + 𝑑𝑒𝑝𝑖 − 𝑣𝑎𝑙𝑖 − 𝑣𝑎𝑙𝑗 − 𝑑𝑒𝑝𝑗,后者可以在深搜时维护一个最小值作为上限。考虑新加到主链上的点𝑎,要满足𝑣𝑎𝑙𝑎 + 𝑣𝑎𝑙𝑗 + 𝑑𝑒𝑝𝑎 − 𝑑𝑒𝑝𝑎 + 𝑑𝑒𝑝𝑗 − 𝑑𝑒𝑝𝑥 ≤ 𝑘,移项得𝑑𝑒𝑝𝑎 ≤ 𝑘 + 𝑑𝑒𝑝𝑎 + 𝑑𝑒𝑝𝑥 − 𝑣𝑎𝑙𝑎 − 𝑣𝑎𝑙𝑗 − 𝑑𝑒𝑝𝑗(注:这里的a有些问题,可以把另一个a看成i),可以维护直接走距离> 𝑘的点𝑗的𝑣𝑎𝑙𝑗+𝑑𝑒𝑝𝑗的最大值来判断是否有解。将前面的式子移项可得𝑣𝑎𝑙𝑗−𝑑𝑒𝑒𝑝𝑗 > 𝑘−𝑣𝑎𝑙𝑖−𝑑𝑒𝑒𝑝𝑖时要用传送门,这个可以用树状数组来维护后缀max,由于树状数组要支持撤销,所以对树状数组每个点开一个队列就行了。