[NOI2014]购票
题目 读懂题目之后能写出一个dp方程, \(dp_i=dp_j+(d_i-d_j)p_i+q_i(d_i-d_j\leq lim_i)\) ,其中 \(d_i\) 是根路径前缀和 不难发现这个东西长得像斜率优化,需要建个凸壳来搞一搞;不难想到一个树剖+线段树维护的无脑做法,是 \(O(n\log^3n)\) 的,看起来和暴力差不多; 考虑有脑做法———— 有根树点分治 ,假设我们当前在处理一棵以 \(x\) 为根的有根树,流程大概长这个样子 找到重心 \(nw\) 将重心与其儿子断开,递归处理重心所在联通块(当然,根也在这个联通块中) 考虑 \(nw\) 到 \(x\) 路径上的点对 \(nw\) 子树内部点产生的影响 递归处理 \(nw\) 的子树 在这道题中,我们将重心子树中的点都搞出来,按照 \(lim_i -dis_i\) 从小到大排序, \(dis_i\) 是点 \(i\) 到根的距离;之后把重心到当前根上的点拿出来,按照距离排序;开个指针扫,把符合条件的点加入下凸壳即可,复查询的时候直接二分,复杂度是 \(O(n\log^2n)\) 代码 #include<bits/stdc++.h> #define re register #define LL long long #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b)