题目大意

~~~~~~有一棵有 n 个节点的根节点为 1 的树,他只能走一条不经过重复节点的路径。
      ~~~~~~给出 q 个形如“x y”的询问,表示他不能走到 x 和 y 的子树中。现在他想知道对于每组询问,他能走的最长路径是多少,如果没有,输出0。
      ~~~~~~n, q<=10^5

【显然】

~~~~~~可走的地方还是一棵树,而我们要求的路径就是这棵树的直径。

【50%】n,q<=2000

~~~~~~每个询问暴力找直径。

【100%】n,q<=10^5

~~~~~~我们需要用线段树维护树的直径。
      ~~~~~~去掉两棵子树,相当于在dfs序上去掉两个区间(注意这两个区间可能有交或存在包含关系),我们把剩下的区间合并就行了。

~~~~~~//线段树维护树的直径:http://blog.csdn.net/rzo_kqp_orz/article/details/52280811

代码

#include<cmath>
#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;typedef long long LL;const int maxn=(1e5)+5, MX=18;struct TR{int x,y,len;TR(int X=0,int Y=0,int LEN=0) {x=X, y=Y, len=LEN;}
};int n;int tot,go[2*maxn],next[2*maxn],f1[maxn];
void ins(int x,int y)
{go[++tot]=y;next[tot]=f1[x];f1[x]=tot;
}int fa[2*maxn][MX+5],deep[maxn],ap[2*maxn],fir[2*maxn],Log[2*maxn],er[MX+5];
void rmq_pre()
{fo(i,1,ap[0]) fa[i][0]=ap[i], Log[i]=log(i)/log(2);fo(i,0,MX) er[i]=1<<i;fo(j,1,MX)fo(i,1,ap[0]){fa[i][j]=fa[i][j-1];if (i+er[j-1]<=ap[0] && deep[fa[i+er[j-1]][j-1]]<deep[fa[i][j]])fa[i][j]=fa[i+er[j-1]][j-1];}
}
int lca(int x,int y)
{x=fir[x], y=fir[y];if (x>y) swap(x,y);int t=Log[y-x+1];return (deep[fa[x][t]]<deep[fa[y-er[t]+1][t]]) ?fa[x][t] :fa[y-er[t]+1][t] ;
}int st[maxn],en[maxn],sum,Tbh[maxn];
void dfs_pre(int k,int last)
{deep[k]=deep[last]+1;ap[++ap[0]]=k, fir[k]=ap[0];Tbh[++sum]=k, st[k]=sum;for(int p=f1[k]; p; p=next[p]) if (go[p]!=last){dfs_pre(go[p],k);ap[++ap[0]]=k;}en[k]=sum;
}TR tr[4*maxn];
int DIS(int x,int y) {return deep[x]+deep[y]-deep[lca(x,y)]*2;}
TR merge(TR a,TR b)
{if (a.len==-1) return b;TR re= (a.len>b.len) ?a :b;if (DIS(a.x,b.x)>re.len) re=TR(a.x,b.x,DIS(a.x,b.x));if (DIS(a.x,b.y)>re.len) re=TR(a.x,b.y,DIS(a.x,b.y));if (DIS(a.y,b.x)>re.len) re=TR(a.y,b.x,DIS(a.y,b.x));if (DIS(a.y,b.y)>re.len) re=TR(a.y,b.y,DIS(a.y,b.y));return re;
}
void tr_js(int k,int l,int r)
{if (l==r){tr[k].x=tr[k].y=Tbh[l];tr[k].len=0;return;}int t=k<<1, t1=(l+r)>>1;tr_js(t,l,t1), tr_js(t+1,t1+1,r);tr[k]=merge(tr[t],tr[t+1]);
}
TR tr_cx(int k,int l,int r,int x,int y)
{if (l==x && r==y) return tr[k];int t=k<<1, t1=(l+r)>>1;if (y<=t1) return tr_cx(t,l,t1,x,y);else if (x>t1) return tr_cx(t+1,t1+1,r,x,y);else return merge(tr_cx(t,l,t1,x,t1),tr_cx(t+1,t1+1,r,t1+1,y));
}int q;
int main()
{freopen("snow.in","r",stdin);freopen("snow.out","w",stdout);scanf("%d %d",&n,&q);fo(i,1,n-1){int x,y;;scanf("%d %d",&x,&y);ins(x,y), ins(y,x);}dfs_pre(1,0);rmq_pre();tr_js(1,1,n);while (q--){int x,y;scanf("%d %d",&x,&y);if (st[x]>st[y]) swap(x,y);TR ans=TR(0,0,-1);if (1<st[x]) ans=merge(ans,tr_cx(1,1,n,1,st[x]-1));if (en[x]+1<st[y]) ans=merge(ans,tr_cx(1,1,n,en[x]+1,st[y]-1));int En=max(en[x],en[y]);if (En<n) ans=merge(ans,tr_cx(1,1,n,En+1,n));printf("%d\n",(ans.len==-1) ?0 :ans.len );}
}

【JZOJ4587】Snow的追寻 题解相关推荐

  1. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  2. 铲雪车(snow) UVA10203 Snow Clearing 题解 优化版

    - 思路和解析,参见第一版题解: 铲雪车题解 洛谷链接 铲雪车 题解 第一版 这里是只是做了输入优化,优化如下: 1.直接使用scanf函数输入,避免了字符转数字. 2.免去了空格数量检测,直接在数字 ...

  3. Codeforces 298A Snow Footprints 题解

    题意 雪地里有一条路,可以向左走.向右走,每走一步会在这一步的起点留下一个朝向走的方向的脚印,新脚印会覆盖旧脚印,现给出脚印的情况,判断起点和终点 思路 如果只有一个方向的脚印,那就是从脚印的一头走到 ...

  4. Codeforces Round #180 (Div. 2) A. Snow Footprints 贪心

    A. Snow Footprints 题目连接: http://www.codeforces.com/contest/298/problem/A Description There is a stra ...

  5. Codeforces Round #470 (rated, Div. 2 C. Producing Snow(思维)

    C. Producing Snow time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  6. 为爱追寻_从机械师到编码员:追寻梦想如何改变了我的生活

    为爱追寻 by David Bruno 大卫·布鲁诺(David Bruno) 从机械师到编码员:追寻梦想如何改变了我的生活 (From mechanic to coder: how followin ...

  7. ICPC训练联盟2021寒假冬令营(5)(部分题解):

    ICPC训练联盟2021寒假冬令营(5)(部分题解): A - Brainman Raymond Babbitt drives his brother Charlie mad. Recently Ra ...

  8. Unique Snowflakes 详细题解

    Unique Snowflakes Emily the entrepreneur has a cool business idea: packaging and selling snowflakes. ...

  9. 题解 [SP4354][AcWing137]TWINSNOW - Snowflakes/雪花雪花雪花

    Luogu link 洛谷的翻译不太清楚,这里是acwing题目链接:https://www.acwing.com/problem/content/139/ 题解 算法:hash+邻接表+(最小表示法 ...

  10. BugkuCTF 部分题解(随缘更新)

    之前做的题在BugkuCTF 部分题解(一) 佛系更新 2月3日更新了ezbypass 11月9日更新了奇怪的压缩包 11月7日更新了这个flag,就是逊啦.不可以破译的密码 bugku 佛系更新 M ...

最新文章

  1. Javascript匿名函数
  2. 用于模拟短信群发情况的随机数产生
  3. 一文读懂:完整的支付系统整体架构
  4. spring boot validated的使用
  5. System类的常用方法及类字段
  6. shiro启动之后页面访问不了_java:shiro入门——4
  7. Java输入年度和月份判断有多少天
  8. 解开Future的神秘面纱之任务执行
  9. SQLServer如何取得随机获取的数据库记录
  10. ASP.NET登录状态保持 并 设置IE cookie
  11. IDEA怎么设置背景图片
  12. 游戏建模中3DMAX里面的【烘焙规范】大盘点
  13. 分形之谢尔宾斯基(Sierpinski)三角形
  14. larval 进程管理
  15. 腾讯混合云存储 TStor 系列再添新成员,并行存储一体机正式发布​
  16. 【python】 彩图RGB 灰度gray互相转化
  17. Python 数据处理与分析(六) 设计一个高回报的投资组合(投资回报和风险分析)任务 5:使用Python实现均值-方差组合模型
  18. SQL39 针对salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005,使用强制索引。
  19. 【Android-Kotlin-Volley】图片画廊学习笔记
  20. Natura Co在收购雅芳的2019年,旗下三大品牌俱实现增长

热门文章

  1. 《炬丰科技-半导体工艺》用于高效显示和通信的无磷白光 LED
  2. 软件服务化:管理当先
  3. 【课程设计】 推箱子游戏(源码+详解)
  4. 快速在网站跳转支付宝付款链接
  5. JavaScript/js 转 Python 代码转换神器 jiphy
  6. 基于Java+Springboot+Vue校园志愿者管理系统设计与实现
  7. 《2022 中国开源贡献度报告》首次发布!
  8. apache(Web服务器)
  9. IsKindOf的用法简介
  10. 在子页面控制父页面iframe的高度