test 0418
照样啥都不会
T1 tree
题意
原题是给定一棵 (n) 个点的树((n le 50000)),求出树上距离前 (m) 大的路径长度((m le 300000))。
开始想法
写了个倍增lca的暴力,不过貌似有些地方炸掉了最后只有20分……
正解
考虑超级钢琴的做法,点分治时依次扫每棵子树,若将当前子树内的点作为路径的一个端点,另一个端点可以落在一个点分治序列的区间内(之前扫过的子树),这样得出一个长度为 nlogn 的点分治序列,加上每个点所对应的区间,然后就完全转为超级钢琴的问题了
T2 mincost
题意
给定 n 个点(编号为 1-n),由 m 条无向边连接的图,每个点有两个权值 ax,bx,给定一个值 k,要求在图中选出大小为 k 的点集 S,使 S 中任意两点间存在仅经过在 S 中的点的路径。设 As 为点集 S 中 ax 的最大值,Bs 为 S 中 bx 的最大值,求一个合法的 S 使得 As+Bs 最小。
开始想法
题目都没怎么看懂……直接
puts("no lolution");
走人……
正解
特判 k=1 后,设每条边的权值为两个顶点权值的最大值,化点权为边权。
考虑从小到大枚举 As,维护最小的 Bs 的值。
注意到 Bs 单调递减,所以我们每次加入一条边时,看看 Bs 是否能减少,也就是问删掉当前权值最大的边后图的最大连通块是否大于等于 k。
用 LCT 维护按权值 b 的最小生成树,每次加入的边没被删就维护最小生成树,删边的时候如果这条边还在生成树上就判断两个连通块的大小并决定是否删除,另外维护一个量记录当前大于 k 的连通块个数,注意 lct 要维护子树大小。
T3 crisis
题意
图是一棵树,安全区只包括在标号 (l) 到 (r) 的城市,小奇现在在城市 (x),它想知道最近的安全城市的距离。
(n,q le 100000)
其中有特殊点菊花图和链
开始想法
搏一搏,单车变摩托
直接最段路(其实想错了只有一条路直接搜索即可,我这反而凭空多一个 (log) )来一波,没想到竟然搞过去了
菊花图的数据搞错了……只有80
正解
每一个线段树结点维护一棵区间内的标号的点形成的虚树,对于每次询问,拆分成 (log(n))段区间,然后分别询问。
将询问离线处理,不妨将询问点都插入区间虚树中,然后对每个线段树的结点一次树形dp 来计算答案。
线段树结点中虚树总点数为((n+q)log n),加上构建虚树的复杂度,总复杂度((n+q)log^2n)