Link
一道题,说明我斜率优化和CDQ分治都学的一知半解。所以会写的很详细。
Solution
30pts
用来对拍
Code
1 | namespace KISS |
40pts
考虑在序列上,无限制的情况。 看起来很斜率优化。 设,优于当且仅当 即 给定,所以递增,可以化为 维护一个下凸壳。 并不是递增的,所以不能用单调队列,需要用单调栈+二分。
Code
1 | namespace NakedOptOnChain |
50pts
加上了路径限制。一开始的想法显然就是在单调栈中二分到第一个可以取到的位置,然后再二分查找最优位置,当时觉得应该不行,但也没想出反例。写出来之后WA,发现反例如下
所以这样是不行的。。
而CDQ分治恰好可以对区间的两半分别做一些操作而不影响答案,于是就CDQ分治
第一维,按照可以到最靠左的点排序;第二维,分治区间
在统计答案的时候,两个指针都从右向左走,维护满足距离限制的凸壳
回溯的时候按照标号的大小顺序归并
Code
1 | namespace DCOnChain |
100pts
这一步做法就非常妙了。 在树上要满足距离限制,也可以借鉴CDQ分治的思路,把用来更新的点和被更新的点隔离开,就可以分别进行一些操作 对树点分治,每层找重心,找到重心之后先把重心的父节点对应的子树DC,然后用从重心的父节点开始,沿着父指针一直走到当前层之外,用这条链上满足距离限制的点更新重心的答案,然后把重心也加进这条链。取出剩下的子树中的所有节点,再按照序列上的做法用那条链更新剩下的节点。
Code
1 | namespace DCOnTree |
Solution
这是第二次做到考算法新推广的题 第一次是用替罪羊思想维护动态点分治 做不出来甚至看不懂题解说明这种算法本身就学的不扎实 以后再碰到这种情况也应该像这样写出退化版问题的程序,可以加深对原算法和推广的算法的理解
Code
1 | //Code by Lucida |