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呢?读取的情况又如何?我写了一些简单的程序,得出了一些简单的数据,贴在这里分享,继续往下阅读前请注意下本文标题中的“无责任”,这表示此测试结果不 ...
随机推荐
- Java中的杂流(闸总)
标准输入输出流 System.in: 标准输入流是InputStream的子类对象,字节输入流,只不过是jvm给定的唯一一个从键盘控制条读入的流. public static final InputS ...
- springCloud参考资料
官网: http://spring.io/projects/spring-cloud 各组件说明(中文版):https://springcloud.cc/spring-cloud-netflflix. ...
- python对具有宏excel的操作
一.使用win32com库 安装pip install pypiwin32 import win32com.client #excel xlApp =win32com.client.DispatchE ...
- (转)4年python,总结一些改善Python程序的建议
自己写Python也有四五年了,一直是用自己的"强迫症"在维持自己代码的质量.都有去看Google的Python代码规范,对这几年的工作经验,做个简单的笔记,如果你也在学pythp ...
- springBoot使用PageHelper当超过最大页数后仍然返回数据
在SpringBoot中使用PageHelper分页插件时,如果设置pagehelper.reasonable=true时,pageNum<=0 时会查询第一页, pageNum>page ...
- java文件上传方式1servlet 方式2springmvc
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcepti ...
- jmeter 参数化3种
一.利用函数助手获取参数值 选项->函数助手对话框 __CSVRead, __Random, 生成的函数字符串:${__Random(,,)}第一个参数为随机数的下限,第二个参数为随机数的上限, ...
- 前端(六)—— 伪类选择器:a标签的伪类、内容伪类、索引伪类、取反伪类
a标签的伪类.内容伪类.索引伪类.取反伪类 一.a标签的四大伪类 :link:未访问状态 :hover:悬浮状态 :active:活跃状态 :visited:已访问状态 四大伪类也可用于其他标签 &l ...
- shell提取rpm的报名
说明: rpm本身未安装,下面方法是基于rpm包文件实现提取rpm的包名 rpm -qpi ZXVEi-git0/CgsOS/abrt-2.1.11-48.el7.centos.x86_64.rpm ...
- leetcode.哈希表.128最长连续序列-Java
1. 具体题目 给定一个未排序的整数数组,找出最长连续序列的长度.要求算法的时间复杂度为 O(n). 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 ...