## 题目大意

max{min(dist(i,u),dist(i,v))}.

n,m105.$n,m\le 10^5.$

## 解题思路

O(nlgn)$O(n\lg n)$预处理,O(1)$O(1)$查询.
bblss123还有倍增的做法.

## 丑丑的代码君

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+5,LG=18,INF=1e9;
ST[2][N][LG];
struct Edge{
int to,nxt;
}edge[N<<1];
}
void rd(int &res){
res=0;
char c;
while(c=getchar(),c<48);
do res=(res<<3)+(res<<1)+(c^48);
while(c=getchar(),c>47);
}
inline void Max(int &a,int b){
if(b>a)a=b;
}
void dfs(int cur,int par,int depth){
if(depth>=mx_dis){
mx_dis=depth;
ID=cur;
}
pre[cur]=par;
int to=edge[i].to;
if(to==par)continue;
dfs(to,cur,depth+1);
}
}
void assign_dfs(int cur,int belong,int depth){
id[cur]=belong;
Max(mx_dep[belong],dep[cur]=depth);
int to=edge[i].to;
if(~id[to])continue;
assign_dfs(to,belong,depth+1);
}
}
void assign(){
memset(id,-1,n+1<<2);
for(int cur=ID,cnt=0;~cur;cur=pre[cur]){
id[cur]=cnt;
arr[cnt++]=cur;
}
tot=mx_dis+1;
for(int i=0;i<tot;++i)
assign_dfs(arr[i],i,0);
}
void init(){
mx_dis=ID=-1;
dfs(1,-1,0);
dfs(ID,-1,0);
assign();
for(int i=0;i<tot;++i){
ST[0][i][0]=mx_dep[i]-i;
ST[1][i][0]=mx_dep[i]+i;
}
for(int j=1;1<<j<=tot;++j)
for(int i=0;i+(1<<j)<=tot;++i)
for(int k=0;k<2;++k)
ST[k][i][j]=max(ST[k][i][j-1],ST[k][i+(1<<j-1)][j-1]);
for(int i=2,j=1;i<=tot+1;++i){
lg[i]=j;
if(!(i&(i-1)))++j;
}
}
int query_mx(bool type,int L,int R){
if(L>R)return -INF;
int k=lg[R-L+2]-1;
return max(ST[type][L][k],ST[type][R-(1<<k)+1][k]);
}
int solve(int u,int v){
if(id[u]==id[v]){
if(dep[u]>dep[v])swap(u,v);
return max(id[u],tot-1-id[u])+dep[u];
}
if(id[u]>id[v])swap(u,v);
int mid=id[u]-dep[u]+id[v]+dep[v]>>1,ans=0;
if(mid<id[u]){
Max(ans,query_mx(0,0,id[v]-1)+id[v]+dep[v]);
Max(ans,dep[v]);
Max(ans,query_mx(1,id[v]+1,tot-1)-id[v]+dep[v]);
}
else if(mid>=id[v]){
Max(ans,query_mx(0,0,id[u]-1)+id[u]+dep[u]);
Max(ans,dep[u]);
Max(ans,query_mx(1,id[u]+1,tot-1)-id[u]+dep[u]);
}
else{
Max(ans,query_mx(0,0,id[u]-1)+id[u]+dep[u]);
Max(ans,dep[u]);
Max(ans,query_mx(1,id[u]+1,mid)-id[u]+dep[u]);
Max(ans,query_mx(0,mid+1,id[v]-1)+id[v]+dep[v]);
Max(ans,dep[v]);
Max(ans,query_mx(1,id[v]+1,tot-1)-id[v]+dep[v]);
}
return ans;
}
int main(){
int sz=128<<20;
char *p=(char*)malloc(sz)+sz;
__asm__("movl %0, %%esp\n" :: "r"(p));
int m,u,v;
rd(n);
tot_edge=0;
for(int i=1;i<n;++i){
rd(u);rd(v);
}
init();
rd(m);
while(m--){
rd(u);rd(v);
printf("%d\n",solve(u,v));
}
return 0;
}
/*

Jun.01.16

Tags:Tree
Submissions:4

Time 93ms
Memory 151600KB

*/

#### 【Codeforces418D】Big Problems for Organizers

2017-10-26 14:47:38

#### CodeChef：Chef and Problems（分块 & 二分）

2017-08-21 00:20:13

#### N-Queens II -- LeetCode

2014-03-07 00:34:00

#### UncaughtException 的使用

2018-03-29 09:53:21

#### 贪心，优化（Sockets，cf 732e）

2016-10-19 20:06:07

#### Pragmatic 101 Design Ingredients to Solve Big Tech Problems 2013 pdf

2013年10月17日 20.26MB 下载

#### 【codeforces 732E】【贪心 map乱搞】

2016-10-22 15:32:31

#### LayoutOrganizers

2014年08月30日 27KB 下载

#### 【jzoj3824】【codeforces RCC 2014 Warmup (Div. 1) D】【Big Problems for Organizers】【树】

2017-01-13 19:18:10

#### POJ-Best Cow Line

2016-02-14 14:10:01

## 不良信息举报

Codeforces418D Big Problems for Organizers