JZOJ5143:无心行挽
Description
“若内心万念俱灰,是否注定无心行挽?”
------来自网易云音乐<Golden Leaves-Passenger>
不必做好输掉一切的准备。
所以,无畏结局。
在尽头,已经不能再做什么,来挽回。
在尽头,所有的一切都走向简化,没有了重复,没有了错杂,只剩下一片废墟。
就是说,世界曾是一副错杂的无向图,而在尽头,它已成为一个没有环的无向连通图,也就是说已成为一棵树。
这棵树有n个节点,有n-1条边,每条边的长度都是1。
给出q组询问,每组询问会给出k个关键点,设f(u)表示所有关键点中离点u最近的关键点离u的距离,求出最大的f(u)。
Input
第一行两个正整数n和q表示树的节点个数以及询问个数
接下来n-1行每行三个数u,v描述一条边,表示u和v之间有一条长度为1的无向边
接下来q组询问,每组询问第一行一个正整数k表示这组询问中关键点的个数,第二行k个正整数,表示这组询问的k个关键点。
Output
共q行,第i行对于第i组询问给出答案,详情见题目描述。
Sample Input
7 5
5 4
6 5
7 3
7 4
1 5
2 4
1
4
1
6
4
6 5 7 2
5
1 5 4 3 7
2
2 3
Sample Output
HINT
uses math;
const
maxn=;
inf=;
var
w:array[..*maxn,..]of longint;
bel,dep,x,y,ans,t,size,key,cle,mxd,wz,ff:array[..maxn]of longint;
tt:array[..maxn,-..]of longint;
pos,mx:array[..maxn,..]of longint;
st,bz:array[..maxn,..]of longint;
i,j,k,tot,tt2:longint;
n,m,len,a,b,top,cnt,anss:longint;
procedure init(a,b:longint);
begin
w[len,]:=b; w[len,]:=;
if w[a,]= then w[a,]:=len else w[w[a,],]:=len;
w[a,]:=len; inc(len);
end;
procedure sort(l,r:longint);
var i,j,a,b:longint;
begin
i:=l; j:=r; a:=pos[x[(l+r)div ],];
repeat
while pos[x[i],]<a do inc(i);
while a<pos[x[j],] do dec(j);
if not(i>j) then
begin
b:=x[i]; x[i]:=x[j]; x[j]:=b;
inc(i); dec(j);
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end;
procedure dfs(a,fa:longint);
var tt:longint;
begin
mx[a,]:=; mx[a,]:=; mxd[a]:=dep[a];
tt:=w[a,]; inc(len); pos[a,]:=len; wz[len]:=a; size[a]:=;
while tt<> do
begin
if w[tt,]<>fa then
begin
dep[w[tt,]]:=dep[a]+;
st[w[tt,],]:=a; dfs(w[tt,],a);
inc(size[a],size[w[tt,]]);
if(mx[a,]=)or(mxd[w[tt,]]>mxd[mx[a,]])then
begin mx[a,]:=mx[a,]; mx[a,]:=w[tt,]; mxd[a]:=mxd[w[tt,]]; end
else if(mx[a,]=)or(mxd[w[tt,]]>mxd[mx[a,]])then mx[a,]:=w[tt,];
end;
tt:=w[tt,];
end;
pos[a,]:=len;
end;
procedure dfss(a,fa:longint);
var tt:longint;
begin
if fa= then bz[a,]:= else
begin
if mx[fa,]=a then tt:=mx[fa,] else tt:=mx[fa,];
if tt= then bz[a,]:= else bz[a,]:=+mxd[tt]-dep[fa];
end;
tt:=w[a,];
while tt<> do
begin
if w[tt,]<>fa then dfss(w[tt,],a);
tt:=w[tt,];
end;
end;
function lca(a,b:longint):longint;
var i:longint;
begin
if dep[a]<dep[b] then begin i:=a; a:=b; b:=i; end;
for i:= downto do
if dep[st[a,i]]>=dep[b] then a:=st[a,i];
if a=b then exit(a);
for i:= downto do
if st[a,i]<>st[b,i] then begin a:=st[a,i]; b:=st[b,i]; end;
exit(st[a,]);
end;
function get(fa,a:longint):Longint;
var i:longint;
begin
for i:= downto do
if dep[st[a,i]]>dep[fa] then a:=st[a,i];
exit(a);
end;
function dis(a,b:longint):longint;
begin exit(dep[a]+dep[b]-*dep[lca(a,b)]); end;
procedure dfs1(a:longint);
var tt:longint;
begin
tt:=w[a,];
if key[a]= then bel[a]:=a else bel[a]:=inf;
while (tt<>) do
begin
dfs1(w[tt,]);
if(bel[w[tt,]]<>inf)and((bel[a]=inf)
or(dis(bel[w[tt,]],a)<dis(bel[a],a))
or((dis(bel[w[tt,]],a)=dis(bel[a],a))and(bel[w[tt,]]<bel[a])))
then bel[a]:=bel[w[tt,]];
tt:=w[tt,];
end;
end;
procedure dfs2(a,fa:longint);
var tt:longint;
begin
ff[a]:=;
if(a<>)and((dis(bel[fa],a)<dis(a,bel[a]))
or((dis(bel[fa],a)=dis(a,bel[a]))and(bel[fa]<bel[a])))
then begin bel[a]:=bel[fa]; ff[a]:=; end;
tt:=w[a,];
while tt<> do
begin dfs2(w[tt,],a); tt:=w[tt,]; end;
end;
function work(a,x:longint):longint;
var i,j,y:longint;
begin
if x= then exit();
j:=; y:=;
for i:= downto do
begin
if j+(<<i)<=x then
begin y:=max(y,j+bz[a,i]); a:=st[a,i]; j:=j+(<<i); end;
end;
exit(y);
end;
procedure build(l,r,fa:longint);
var mid,x:longint;
begin
inc(tot); x:=tot; tt[x,]:=l; tt[x,]:=r;
if tt[x,]=tt[fa,] then tt[fa,-]:=x else tt[fa,-]:=x;
if l=r then begin tt[x,]:=dep[wz[l]]; exit; end;
mid:=(l+r)>>;
build(l,mid,x); build(mid+,r,x);
tt[x,]:=max(tt[tt[x,-],],tt[tt[x,-],]);
end;
function find(x,l,r:longint):longint;
var ll,rr,mid:longint;
begin
if l>r then exit();
ll:=tt[x,]; rr:=tt[x,];
if(ll=l)and(rr=r)then exit(tt[x,]);
mid:=(ll+rr)>>;
if r<=mid then exit(find(tt[x,-],l,r));
if l>mid then exit(find(tt[x,-],l,r));
exit(max(find(tt[x,-],l,mid),find(tt[x,-],mid+,r)));
end;
procedure solve(a,fa:longint);
var tt,sum,aa,i,x,md,dis1,dis2,z:longint;
begin
if fa= then
begin
md:=work(a,dep[a]-dep[]);
ans[bel[a]]:=max(ans[bel[a]],md+dis(a,bel[a]));
end else
begin
tt:=get(fa,a); aa:=a;
if bel[a]=bel[fa] then
begin
if ff[a]= then
begin
md:=find(,pos[tt,],pos[a,]-);
md:=max(md,find(,pos[a,]+,pos[tt,]));
ans[bel[a]]:=max(ans[bel[a]],md-dep[fa]+dis(fa,bel[a]));
end else
begin
md:=work(a,dep[a]-dep[tt]);
ans[bel[a]]:=max(ans[bel[a]],md+dis(a,bel[a]));
end;
end else
begin
dis1:=dis(fa,bel[fa]); dis2:=dis(a,bel[a]);
for i:= downto do
begin
if dep[st[aa,i]]<dep[tt] then continue;
if(dep[a]-dep[st[aa,i]]+dis2<dep[st[aa,i]]-dep[fa]+dis1)
or((dep[a]-dep[st[aa,i]]+dis2=dep[st[aa,i]]-dep[fa]+dis1)
and(bel[a]<bel[fa]))then aa:=st[aa,i];
end;
md:=work(a,dep[a]-dep[aa]);
ans[bel[a]]:=max(ans[bel[a]],dis(a,bel[a])+md);
md:=find(,pos[tt,],pos[aa,]-);
md:=max(md,find(,pos[aa,]+,pos[tt,]));
ans[bel[fa]]:=max(ans[bel[fa]],md-dep[tt]+dis(tt,bel[fa]));
end;
end;
md:=dep[a]; tt:=w[a,]; x:=pos[a,]-;
while tt<> do
begin
z:=get(a,w[tt,]);
md:=max(md,find(,x+,pos[z,]-));
x:=pos[z,]; solve(w[tt,],a); tt:=w[tt,];
end;
md:=max(md,find(,x+,pos[a,]));
ans[bel[a]]:=max(ans[bel[a]],md-dep[a]+dis(a,bel[a]));
end;
begin
assign(input,'do.in'); reset(input);
assign(output,'do.out'); rewrite(output);
readln(n,m); len:=n+;
for i:= to n- do
begin readln(a,b); init(a,b); init(b,a); end;
init(,); init(,); dep[]:=; len:=; dfs(,); dfss(,);
for j:= to do for i:= to n do
st[i,j]:=st[st[i,j-],j-];
for j:= to do for i:= to n do
if st[i,j-]> then bz[i,j]:=max(bz[i,j-],(<<(j-))+bz[st[i,j-],j-]);
build(,n+,);
fillchar(key,sizeof(key),);
fillchar(bel,sizeof(bel),);
fillchar(ans,sizeof(ans),);
fillchar(w,sizeof(w),);
for i:= to m do
begin
readln(cnt);
for j:= to cnt do
begin read(x[j]); y[j]:=x[j]; cle[j]:=x[j]; key[x[j]]:=; end;
sort(,cnt); top:=; t[top]:=; len:=n+; cle[]:=cnt+; cle[cnt+]:=;
for j:= to cnt do
begin
tt2:=lca(x[j],t[top]);
while dep[tt2]<dep[t[top]] do
begin
if dep[t[top-]]<=dep[tt2] then
begin
init(tt2,t[top]); dec(top);
if t[top]<>tt2 then
begin inc(top); t[top]:=tt2; inc(cle[]); cle[cle[]]:=tt2; end;
break;
end;
init(t[top-],t[top]); dec(top);
end;
inc(top); t[top]:=x[j];
end;
while top> do
begin init(t[top-],t[top]); dec(top); end;
dfs1(); dfs2(,); solve(w[w[,],],);
anss:=;
for j:= to cnt do anss:=max(anss,ans[y[j]]); writeln(anss);
for j:= to cle[] do
begin
w[cle[j],]:=; key[cle[j]]:=;
bel[cle[j]]:=inf; ans[cle[j]]:=;
end;
end;
close(input); close(output);
end.
JZOJ5143:无心行挽的更多相关文章
- 【loj6184】无心行挽(虚树+倍增)
题目链接:https://loj.ac/problem/6184 每次询问给一些关键点,询问树上每个点离最近的关键点的距离(以后称为f(u))最大值是多少. 询问数比较大,但 \sum{K} 和n是一 ...
- 探真无阻塞加载javascript脚本技术,我们会发现很多意想不到的秘密
下面的图片是我使用firefox和chrome浏览百度首页时候记录的http请求 下面是firefox: 下面是chrome: 在浏览百度首页前我都将浏览器的缓存全部清理掉,让这个场景最接近第一次访问 ...
- 如何在高并发环境下设计出无锁的数据库操作(Java版本)
一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
- logstash file输入,无输出原因与解决办法
1.现象 很多同学在用logstash input 为file的时候,经常会出现如下问题:配置文件无误,logstash有时一直停留在等待输入的界面 2.解释 logstash作为日志分析的管道,在实 ...
- nodejs利用ajax实现网页无刷新上传图片
nodejs利用ajax实现网页无刷新上传图片 标签(空格分隔): nodejs 通常情况下上传图片是要通过提交form表单来实现的,但是这又不可避免的产生了网页转. 利用ajax技术和FormDat ...
- 【原】无脑操作:express + MySQL 实现CRUD
基于node.js的web开发框架express简单方便,很多项目中都在使用.这里结合MySQL数据库,实现最简单的CRUD操作. 开发环境: IDE:WebStorm DB:MySQL ------ ...
- 监督学习 VS 无监督学习
监督学习 就是人们常说的分类,通过已有的训练样本(即已知数据以及其对应的输出)去训练得到一个最优模型(这个模型属于某个函数的集合,最优则表示在某个评价准则下是最佳的),再利用这个模型将所有的输入映射为 ...
- MongoDB与PostgresQL无责任初步测试
PostgresQL一秒能插入多少条记录,MongoDB呢?读取的情况又如何?我写了一些简单的程序,得出了一些简单的数据,贴在这里分享,继续往下阅读前请注意下本文标题中的“无责任”,这表示此测试结果不 ...
随机推荐
- spring framework三个版本的下载包区别
docs:该文件夹下包含Spring的相关文档.开发指南及API参考文档:dist:该文件夹下包含Spring jar包.文档.项目等内容:schema:里面包含了Spring4所用到的xsd文件:
- 用JavaScript写一个JD放大镜
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Java异常架构与异常关键字
Java异常简介 Java异常是Java提供的一种识别及响应错误的一致性机制. Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性.在有效使用异常的情况 ...
- 【leetcode】388. Longest Absolute File Path
题目如下: Suppose we abstract our file system by a string in the following manner: The string "dir\ ...
- express简易代理请求
var express = require('express') var app = express() var proxy = require('http-proxy-middleware') va ...
- Transactional事务管理操作
Transactional的属性: alue String 可选的限定描述符,指定使用的事务管理器 propagation enum: Propagation 可选的事务传播行为设置 isolatio ...
- ASP.NET Core学习——4
静态文件 静态文件(static files),例如HTML.CSS.图片和JavaScript之类的资源会被ASP.NET Core应用直接提供给客户端. 静态文件通常位于web root(< ...
- linux下根据根据进程号查端口、根据端口号查进程号汇总,以及netstat的相关资料(工作中匮乏的知识)
根据端口查进程: lsof -i:port netstat -nap | grep port 根据进程号查端口: lsof -i|grep pid netstat -nap | grep pid 根据 ...
- MDK中问题:warning : type qualifier is meaningless on cast type return 的解决
在MDK编译代码时,有时会出现这样的警告, warning : type qualifier is meaningless on cast type return 在MDK中,作如下设置: 即添加 : ...
- 剑指offer第二版面试题3:二维数组中的查找(JAVA版)
题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 1 2 8 9 2 4 ...