「こんなきれいな星も、やっぱりここまで来てから、見れたのだと思うから。だから・・もっと遠くへ・・」

THUSC Day 0 训练日记

今天乘火车参加THUSC.
在火车上捉了WC2010 重建计划,大概是给定一棵树,求一条长度在[L,R]之间的简单路径使得平均值最大。
解法显然二分答案然后树分治各种乱搞…… 各种乱搞的话最显而易见的是直接线段树。但这样是O(Nlg^3N)的,跑最大的点要近1分钟…… 于是NB的事情就发生了,考虑每个子树的最深深度,然后按最深深度给子树排序。子树内部再按每个结点的深度排序。然后对每棵子树的查询都可以单调队列,做 到O(D+maxD),D是当前子树的深度,maxD是前面最深的子树的深度。然后因为我们已经按最深深度对所有子树排序了,所以maxD<=D, 也就是时间复杂度O(D),也就是总复杂度O(sigma(D)),即子树大小。这样处理的过程就少了一个log。但问题来了,我们这个处理要排序后才能 进行,这样排序复杂度就有一个log了,这时NB的事情再次发生,我们可以在树分治内部进行二分!对于某个结点树分治的内容已经确定了,可以排序后二分判 定时直接用这个排序后的结果,然后排序的log就不是在二分的log里面了! 这样就彻底偷掉一个log,变成O(Nlg^2N),就可以过了。


在宾馆又捉了一题,国家集训队2012互测题,李超的attack. 这题大概是平面上给n个点有权值,然后要求支持交换两个点的权值、查询一个矩形内的点的k大权值。
做法也是比较乱搞的。首先按x轴排序,分成n^0.5块。然后每一块内按y坐标排序。于是每个询问如果x区间完整覆盖了一个块,那么块内符合条件的点必然 是连续一段。然后问题就变成经典的区间k大带修改的问题了。这个可以用主席树或划分树,然后二分答案。但有个更好的做法就是直接用函数式trie树。这样 树的形态是相同的,就不用二分答案了,修改也方便。但因为修改时候会暴力重建两个块的函数式数据结构,所以直接函数式会爆内存。一个处理方法就是,使用静 态数组,然后如果数组快要爆了就直接重建整个函数式数据结构。这样就能过了。时间复杂度是O(32*(N+Q)*N^0.5).