题解:

正解做法比较简单,考虑离线之后,相邻两个节点之间的答案是有关系的

发现从父亲移到儿子后,改变的距离对于当前节点子树内和子树外的是一样的

所以线段树维护一下区间加减取max就可以了

另外的做法1:

过不了,考虑分块

对连续的叶子分成一个块,维护每个点到这个点的距离,可以多源最短路nlogn

然后查询的时候零散的要查找两个点之间的距离,这个可以O(1)rmq

所以块大小设成$\sqrt{nlogn}$是$q\sqrt{nlogn}$

理论复杂度1.5e9。。。别想过了

做法2:

这个做法可以在线(正解可持久化一下当然也可以),比正解麻烦

考虑询问一个点x,那么它儿子内的点我们只需要查到根距离最短的就可以了

然后我们去考虑枚举叶子和当前点的$lca$,这时候我们发现我们只需要查找离$lca$最近的那个点就行了

但是$lca$暴力枚举只有在树是随机的情况下才是对的

我们把距离写成$dis[x]-dis[lca]+dis2[lca]$ 其中$dis$表示到根距离,$dis2$表示子树中到它的最短距离

如果我们知道$dis2$我们就可以维护了

我们把问题按照$dfs$序和$x$的$dfs$序的大小关系分成两类

以小于为例

令$dis2[lca]$为$lca$子树内$dfs$序小于$dfs[x]$到$lca$的最短距离

那么我们会发现,对于$x$连续的一段祖先,我们考虑它就是考虑$dis2$

会发现对于不同节点,查询同一个节点$k$的$dis2[k]$是不同的

所以我们用$dis2[k]$记录原本应该$dis2[fa[k]]$记录的东西,那么就唯一了

倍增维护

直到$lca(第一个叶子,x)$这个节点可能是不完整的

所以要特殊查一下

查的话可以可持久化线段树合并维护一下每个点子树内dfs为k的值,然后区间查询就可以了

起始位置如果没有包含所有比$dfs[x]$小的节点也要特殊查一下

大于同理

最后复杂度还是$nlogn$的

codeforces 1110F的更多相关文章

  1. Codeforces.1110F.Nearest Leaf(线段树)

    题目链接 \(dls\)讲过这道题,所以这不是线段树裸题吗,这场没打气气气气气=-= 现在是写着玩=v= \(Description\) 给定一棵\(n\)个点的树.\(q\)次询问,每次询问给定\( ...

  2. CodeForces 1110F Nearest Leaf | 线段树/换根

    我--又诈尸了-- 代码几乎都不会写了,打场CF居然上分啦,开心!(虽然还是比不过列表里的各路神仙) 题目链接 题目描述 一棵\(n\)个点的有根树,规定一种dfs序(规则:编号小的点优先dfs),\ ...

  3. Codeforces 1110F(DFS序+线段树)

    题面 传送门 分析 next_id = 1 id = array of length n filled with -1 visited = array of length n filled with ...

  4. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  5. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  6. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  7. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  8. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  9. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

随机推荐

  1. CF487E Tourists--圆方树

    既然有这条性质,这题就很简单了: \(可能在a->b的简单路径上的点集,就是圆方树上a->b路径上方点代表的点双的并集\) 对每一个方点维护一个\(multiset\),代表其在圆方树上子 ...

  2. halcon+WinForm打开摄像头

    注意引用halcon.dll,项目属性平台一致(X64) using HalconDotNet;//引用halcon using System.Threading;//引用线程 namespace M ...

  3. Vue(服务端渲染)

    一.前言 1.服务端渲染图解                                                 2.简介服务端渲染                             ...

  4. 20175209 《Java程序设计》第八周学习总结

    20175209 <Java程序设计>第八周学习总结 一.教材知识点总结 1.泛型 1.泛型类声明: 格式 class People<E> People是泛型类名称 E是泛型列 ...

  5. 03--STL序列容器(Deque)

    一:Deque双端队列<头尾操作> stack和queue是在Deque的基础上改进的,所以先介绍双端队列Deque     deque是“double-ended queue”的缩写,和 ...

  6. finalize()与PhantomReference学习笔记

    众所周知,Java语言提供了自动垃圾回收机制,使得程序员不用考虑自己释放不再使用的内存.既然回收内存的活都让Java自己干了,程序员在这方面能干的事情就不多了.尽管如此,Java也提供了一些让程序员对 ...

  7. GDB调试技巧:总结篇

    目录 一 写在开头 1.1 本文内容 二 学习资料 三 常用命令 四 调试技巧 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 写在开头 1.1 本文内容 总结GDB调试的一些常用命令和调试 ...

  8. string与number转换

    数字变字符串:str+'' 字符串变数字:str-0

  9. (七)File 文件的操作

    一.文件读写模式 1.文件的几种模式: 格式:f=open("文件名","模式",encode="utf-8") #文件的只读模式 f1=o ...

  10. C#中Dictionary的介绍

    关键字:C# Dictionary 字典 作者:txw1958原文:http://www.cnblogs.com/txw1958/archive/2012/11/07/csharp-dictionar ...