今年夏天,NOI 在 SZ 市迎来了她 30 周岁的生日。来自全国 个城市的 OIer 们都会从各地出发,到 SZ 市参加这次盛会。
全国的城市构成了一棵以 SZ 市为根的有根树,每个城市与它的父亲用道路连接。为了方便起见,我们将全国的 个城市用 到 的整数编号。其中 SZ 市的编号为 。对于除 SZ 市之外的任意一个城市 ,我们给出了它在这棵树上的父亲城市 以及到父亲城市道路的长度 。
从城市 前往 SZ 市的方法为:选择城市 的一个祖先 ,支付购票的费用,乘坐交通工具到达 。再选择城市 的一个祖先 ,支付费用并到达 。以此类推,直至到达 SZ 市。
对于任意一个城市 ,我们会给出一个交通工具的距离限制 。对于城市 的祖先 ,只有当它们之间所有道路的总长度不超过 时,从城市 才可以通过一次购票到达城市 ,否则不能通过一次购票到达。对于每个城市 ,我们还会给出两个非负整数 作为票价参数。若城市 到城市 所有道路的总长度为 ,那么从城市 到城市 购买的票价为 。
每个城市的 OIer 都希望自己到达 SZ 市时,用于购票的总资金最少。你的任务就是,告诉每个城市的 OIer 他们所花的最少资金是多少。
Constraints
Solution
由题意可得,令 表示点 到点 的距离,我们利用祖先去更新节点,可以得到以下式子:
考虑斜率优化,令点 为点 的祖先,则可以得到式子: 。
令 表示点 到根节点的距离,则式子可以变换为: 。
所以只需要维护凸包,每一次在凸包上二分斜率即可。为了保证复杂度,在点分治的基础上,我们将所有需要更新的点按照有效的祖先节点进行排序。处理时先处理祖先部分的节点,再用祖先部分的信息来更新其他节点。
Code
1 |
|