(jzoj snow的追寻)线段树维护树的直径
jzoj snow的追寻
DFS序上搞
合并暴力和,记录最长链和当前最远点,距离跑LCA
# include <stdio.h>
# include <stdlib.h>
# include <iostream>
# include <algorithm>
# include <string.h>
# define IL inline
# define RG register
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
IL ll Read(){
RG char c = getchar(); RG ll x = 0, z = 1;
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + c - '0';
return x * z;
}
const int MAXN(1e5 + 10);
int n, ft[MAXN], cnt, Q;
int size[MAXN], fa[MAXN], top[MAXN], son[MAXN], dfn[MAXN], ed[MAXN], id[MAXN], dep[MAXN];
struct Edge{ int to, nt; } edge[MAXN << 1];
struct Data{ int u, v, len; } t[MAXN << 2], ans;
IL void Add(RG int u, RG int v){
edge[cnt] = (Edge){v, ft[u]}; ft[u] = cnt++;
}
IL void Dfs1(RG int u){
size[u] = 1;
for(RG int e = ft[u]; e != -1; e = edge[e].nt){
RG int v = edge[e].to;
if(size[v]) continue;
dep[v] = dep[u] + 1; fa[v] = u;
Dfs1(v);
size[u] += size[v];
if(size[v] > size[son[u]]) son[u] = v;
}
}
IL void Dfs2(RG int u, RG int Top){
top[u] = Top; dfn[u] = ++cnt; id[cnt] = u;
if(son[u]) Dfs2(son[u], Top);
for(RG int e = ft[u]; e != -1; e = edge[e].nt)
if(!dfn[edge[e].to]) Dfs2(edge[e].to, edge[e].to);
ed[u] = cnt;
}
IL ll Dis(RG int u, RG int v){
if(!u || !v) return 0;
RG ll dis = dep[u] + dep[v];
while(top[u] != top[v]){
if(dep[top[u]] < dep[top[v]]) swap(u, v);
u = fa[top[u]];
}
if(dep[u] > dep[v]) swap(u, v);
return dis - 2 * dep[u];
}
IL Data Merge(RG Data x, RG Data y){
RG int p[4] = {x.u, x.v, y.u, y.v};
x.len = x.u = x.v = 0;
for(RG int i = 0; i < 3; i++)
for(RG int j = i + 1; j < 4; j++){
RG ll dis = Dis(p[i], p[j]);
if(dis > x.len) x.len = dis, x.u = p[i], x.v = p[j];
}
return x;
}
IL void Query(RG int x, RG int l, RG int r, RG int L, RG int R){
if(l >= L && r <= R) ans = Merge(ans, t[x]);
else{
RG int mid = l + r >> 1;
if(mid >= L) Query(x << 1, l, mid, L, R);
if(mid < R) Query(x << 1 | 1, mid + 1, r, L, R);
}
}
IL void Build(RG int x, RG int l, RG int r){
if(l == r) t[x].u = t[x].v = id[l], t[x].len = 0;
else{
RG int mid = l + r >> 1, ls = x << 1, rs = x << 1 | 1;
Build(ls, l, mid); Build(rs, mid + 1, r);
t[x] = Merge(t[ls], t[rs]);
}
}
int main(RG int argc, RG char* argv[]){
Fill(ft, -1);
n = Read(); Q = Read();
for(RG int i = 1; i < n; i++){
RG int u = Read(), v = Read();
Add(u, v); Add(v, u);
}
cnt = 0; Dfs1(1); Dfs2(1, 1);
Build(1, 1, n);
while(Q--){
RG int u = Read(), v = Read();
if(u == 1 || v == 1){ puts("0"); continue; }
if(dfn[u] > dfn[v]) swap(u, v);
ans.u = ans.v = ans.len = 0;
if(dfn[u] > 1) Query(1, 1, n, 1, dfn[u] - 1);
if(ed[u] + 1 < dfn[v]) Query(1, 1, n, ed[u] + 1, dfn[v] - 1);
if(max(ed[v], ed[v]) < n) Query(1, 1, n, max(ed[v], ed[u]) + 1, n);
printf("%d\n", ans.len);
}
return 0;
}
(jzoj snow的追寻)线段树维护树的直径的更多相关文章
- 倍增/线段树维护树的直径 hdu5993/2016icpc青岛L
题意: 给一棵树,每次询问删掉两条边,问剩下的三棵树的最大直径 点10W,询问10W,询问相互独立 Solution: 考虑线段树/倍增维护树的直径 考虑一个点集的区间 [l, r] 而我们知道了有 ...
- Snow的追寻--线段树维护树的直径
Snow终于得知母亲是谁,他现在要出发寻找母亲.王国中的路由于某种特殊原因,成为了一棵有n个节点的根节点为1的树,但由于"Birds are everywhere.",他得到了种种 ...
- 2016shenyang-1002-HDU5893-List wants to travel-树链剖分+线段树维护不同区间段个数
肯定先无脑树链剖分,然后线段树维护一段区间不同个数,再维护一个左右端点的费用. 线段树更新,pushDown,pushUp的时候要注意考虑链接位置的费用是否相同 还有就是树链剖分操作的时候,维护上一个 ...
- 学习笔记--函数式线段树(主席树)(动态维护第K极值(树状数组套主席树))
函数式线段树..资瓷 区间第K极值查询 似乎不过似乎划分树的效率更优于它,但是如果主席树套树状数组后,可以处理动态的第K极值.即资瓷插入删除,划分树则不同- 那么原理也比较易懂: 建造一棵线段树(权值 ...
- Codeforces GYM 100114 D. Selection 线段树维护DP
D. Selection Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descriptio ...
- [BZOJ 3995] [SDOI2015] 道路修建 【线段树维护连通性】
题目链接:BZOJ - 3995 题目分析 这道题..是我悲伤的回忆.. 线段树维护连通性,与 BZOJ-1018 类似,然而我省选之前并没有做过 1018,即使它在 ProblemSet 的第一页 ...
- [BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】
题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经 ...
- HDU3564 --- Another LIS (线段树维护最值问题)
Another LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- CodeForces 343D 线段树维护dfs序
给定一棵树,初始时树为空 操作1,往某个结点注水,那么该结点的子树都注满了水 操作2,将某个结点的水放空,那么该结点的父亲的水也就放空了 操作3,询问某个点是否有水 我们将树进行dfs, 生成in[u ...
随机推荐
- Tomcat服务器的配置
本地安装的Tomcat服务器版本是 Apache Tomcat/7.0.42 启动 localhost 使用Tomcat的前提是安装了jdk,我在本地安装了jdk7.Tomcat服务器的文件目录为F: ...
- mac攻略(4) -- 使用brew配置php7开发环境(mac+php+apache+mysql+redis)
[http://www.cnblogs.com/redirect/p/6131751.html] 网上有很多文章都是错误的,因为是copy别人的,作者没有自己亲测,不仅不能给新手提供帮助,还会产生严重 ...
- Android Camera 摄像 demo
google 在Android 5.0推出 Camera2 这个类,用于替换 Camera,但是Camera2要求android sdk 最低版本为 minSdkVersion = 21 ...
- 【Unity3D技术文档翻译】第1.7篇 AssetBundles 补丁更新
上一章:[Unity3D技术文档翻译]第1.6篇 使用 AssetBundle Manager 本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced ...
- bzoj 3166 [Heoi2013]Alo 可持久化Trie
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1227 Solved: 569[Submit][Status ...
- 弄懂 JRE、JDK、JVM 之间的区别与联系
其实很多 Java 程序员在写了很多代码后,你问他 jre 和 jdk 之间有什么关系,jvm 又是什么东西,很多人不知所云.本篇不会讲述 jvm 底层是如何与不同的系统进行交互的,而主要理清楚三者之 ...
- linux Nagios监控
监控目标 监控目标主机分为四个部分 硬件资源 操作系统 数据库 应用软件 监控目的: 进行服务器性能调整前,知道调整什么,系统瓶颈在什么地方 被一部分必须同时监控,内容包括吞吐量,反应时间,使用率等 ...
- linux redis基础应用 主从服务器配置
Redis基础应用 redis是一个开源的可基于内存可持久化的日志型,key-value数据库redis的存储分为内存存储,磁盘存储和log文件三部分配置文件中有三个参数对其进行配置 优势:和memc ...
- (28000): Access denied for user 'root'@'127.0.0.1' (using password: YES)
在一台测试服务器测试Python脚本时,执行Python脚本时报如下错误: 主要错误信息为"operation the sql fail!1045 (28000): Access den ...
- mongodb副本集搭建过程中的问题和解决技巧
在我以往的认知中,一个系统一旦正式上线,多半不会轻易的迁移服务器,尤其是那种涉及到多个关联应用,涉及到多台硬件服务器的系统,因为这种迁移将是牵一发而动全身的. 但是,却仍然有这种情况存在,就如我这几天 ...