【BZOJ3991】寻宝游戏(虚树,DFS序,splay)
题意:求在树中从任意点开始,经过若干个关键点回到原点的最小距离
要求支持在线将某个点设置(取消)为关键点,以及询问答案
n,m<=100000 len[i]<=10^9
思路:显然是一个虚树的模型,但并不需要虚树
其实就是求虚树的所有路径长度之和的2倍
思考后可以发现,必定是按DFS序从小到大走,再从最大点回到最小点总路程最短
所以只需要维护DFS序的插入,删除,前驱,后继,最大,最小,splay即可
插入点i时找到与它DFS序相邻的点x和y,对答案有dis(x,i)+dis(y,i)-dis(x,y)的贡献
最后加上首尾长度
var t:array[..,..]of longint;
f:array[..,..]of longint;
fa,rev,size:array[..]of longint;
flag,dfn,id,dep,head,vet,next,len,b:array[..]of longint;
dis,num:array[..]of int64;
n,m,i,x,y,tot,root,cnt,time,z:longint;
ans,v,tmp,oo,l,r:int64; procedure swap(var x,y:longint);
var t:longint;
begin
t:=x; x:=y; y:=t;
end; procedure pushup(x:longint);
var l,r:longint;
begin
l:=t[x,]; r:=t[x,];
size[x]:=size[l]+size[r]+;
end; procedure rotate(x:longint;var k:longint);
var y,z,l,r:longint;
begin
y:=fa[x]; z:=fa[y];
if t[y,]=x then l:=
else l:=;
r:=l xor ;
if y<>k then
begin
if t[z,]=y then t[z,]:=x
else t[z,]:=x;
end
else k:=x;
fa[x]:=z; fa[y]:=x; fa[t[x,r]]:=y;
t[y,l]:=t[x,r]; t[x,r]:=y;
pushup(y);
pushup(x);
end; procedure splay(x:longint;var k:longint);
var y,z:longint;
begin
while x<>k do
begin
y:=fa[x]; z:=fa[y];
if y<>k then
begin
if (t[y,]=x)xor(t[z,]=y) then rotate(x,k)
else rotate(y,k);
end
else k:=x;
rotate(x,k);
end;
end; function kth(x:longint):longint;
var k,tmp:longint;
begin
k:=root;
while k<> do
begin
tmp:=size[t[k,]]+;
if tmp=x then exit(k)
else if tmp>x then k:=t[k,]
else
begin
k:=t[k,]; x:=x-tmp;
end;
end;
end; function pred(x:int64):int64;
var k:longint;
last:int64;
begin
k:=root; last:=-oo;
while k<> do
begin
if num[k]<x then begin last:=num[k]; k:=t[k,]; end
else k:=t[k,];
end;
exit(last);
end; function succ(x:int64):int64;
var k:longint;
last:int64;
begin
k:=root; last:=oo;
while k<> do
begin
if num[k]>x then begin last:=num[k]; k:=t[k,]; end
else k:=t[k,];
end;
exit(last);
end; function rank(x:int64):longint;
var k:longint;
begin
rank:=; k:=root;
while k<> do
begin
if num[k]<x then begin rank:=rank+size[t[k,]]+; k:=t[k,]; end
else k:=t[k,];
end;
end; procedure ins(x:int64);
var k,k1,k2:longint;
begin
k:=rank(x);
k1:=kth(k-);
k2:=kth(k);
splay(k1,root);
splay(k2,t[root,]);
k:=t[root,];
inc(cnt); t[k,]:=cnt; fa[cnt]:=k; size[cnt]:=; num[cnt]:=x;
inc(tot);
end; procedure del(x:int64);
var k,k1,k2:longint;
begin
k:=rank(x);
k1:=kth(k-);
k2:=kth(k+);
splay(k1,root);
splay(k2,t[root,]);
k1:=t[root,]; k2:=t[k1,];
t[k1,]:=; size[k1]:=size[t[k1,]]+;
fa[k2]:=; t[k2,]:=; t[k2,]:=; size[k2]:=; num[k2]:=;
dec(tot);
end; function lca(x,y:longint):longint;
var i,d:longint;
begin
if dep[x]<dep[y] then swap(x,y);
d:=dep[x]-dep[y];
for i:= to do
if d and (<<i)> then x:=f[x,i];
for i:= downto do
if f[x,i]<>f[y,i] then
begin
x:=f[x,i]; y:=f[y,i];
end;
if x=y then exit(x);
exit(f[x,]);
end; function query(x,y:longint):int64;
var q:longint;
begin
q:=lca(x,y);
exit(dis[x]+dis[y]-*dis[q]);
end; procedure add(a,b,c:longint);
begin
inc(tot);
next[tot]:=head[a];
vet[tot]:=b;
len[tot]:=c;
head[a]:=tot;
end; procedure dfs(u:longint);
var i,e,v:longint;
begin
flag[u]:=;
inc(time); dfn[u]:=time; id[time]:=u;
for i:= to do
begin
if dep[u]<<<i then break;
f[u,i]:=f[f[u,i-],i-];
end;
e:=head[u];
while e<> do
begin
v:=vet[e];
if flag[v]= then
begin
dep[v]:=dep[u]+;
dis[v]:=dis[u]+len[e];
f[v,]:=u;
dfs(v);
end;
e:=next[e];
end;
end; begin
assign(input,'bzoj3991.in'); reset(input);
assign(output,'bzoj3991.out'); rewrite(output);
readln(n,m);
for i:= to n- do
begin
readln(x,y,z);
add(x,y,z);
add(y,x,z);
end;
dfs();
oo:=<<;
num[]:=oo; t[,]:=; size[]:=;
num[]:=-oo; fa[]:=; size[]:=;
root:=; cnt:=; tot:=;
for i:= to m do
begin
readln(x);
if b[x]= then begin v:=; ins(dfn[x]); end
else begin v:=-; del(dfn[x]); end;
b[x]:=b[x] xor ;
l:=pred(dfn[x]);
r:=succ(dfn[x]);
if l<>-oo then ans:=ans+v*query(id[l],x);
if r<>oo then ans:=ans+v*query(id[r],x);
if (l<>-oo)and(r<>oo) then ans:=ans-v*query(id[l],id[r]);
tmp:=;
if tot> then
begin
l:=kth();
r:=kth(tot-);
tmp:=query(id[num[l]],id[num[r]]);
end;
writeln(ans+tmp);
end;
close(input);
close(output);
end.
【BZOJ3991】寻宝游戏(虚树,DFS序,splay)的更多相关文章
- 【BZOJ】3991: [SDOI2015]寻宝游戏 虚树+DFS序+set
[题意]给定n个点的带边权树,对于树上存在的若干特殊点,要求任选一个点开始将所有特殊点走遍后返回.现在初始没有特殊点,m次操作每次增加或减少一个特殊点,求每次操作后的总代价.n,m<=10^5. ...
- BZOJ 3991: [SDOI2015]寻宝游戏 [虚树 树链的并 set]
传送门 题意: $n$个点的树,$m$次变动使得某个点有宝物或没宝物,询问每次变动后集齐所有宝物并返回原点的最小距离 转化成有根树,求树链的并... 两两树链求并就可以,但我们按照$dfs$序来两两求 ...
- BZOJ3991:寻宝游戏 (LCA+dfs序+树链求并+set)
小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄,然后可以任意在地图的道路上行走 ...
- bzoj 3991: [SDOI2015]寻宝游戏 虚树 set
目录 题目链接 题解 代码 题目链接 bzoj 3991: [SDOI2015]寻宝游戏 题解 发现每次答案就是把虚树上的路径*2 接在同一关键点上的点的dfs序是相邻的 那么用set动态维护dfs序 ...
- 洛谷3320 SDOI2015寻宝游戏(set+dfs序)(反向迭代器的注意事项!)
被\(STL\)坑害了一个晚上,真的菜的没救了啊. 准确的说是一个叫\(reverse\ iterator\)的东西,就是我们经常用的\(rbegin()\) 有一个非常重要的性质 在反向迭代器中,+ ...
- BZOJ_3252_攻略_线段树+dfs序
BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...
- 【XSY2534】【BZOJ4817】树点涂色 LCT 倍增 线段树 dfs序
题目大意 Bob有一棵\(n\)个点的有根树,其中\(1\)号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜 ...
- 【bzoj4817】树点涂色 LCT+线段树+dfs序
Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...
- Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序
题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s 内存限制:512.0MB 总提交次数:196 AC次数:65 平均分: ...
- 51 nod 1681 公共祖先 (主席树+dfs序)
1681 公共祖先 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有一个庞大的家族,共n人.已知这n个人的祖辈关系正好形成树形结构(即父亲向儿子连边). 在另 ...
随机推荐
- root.sh脚本支持checkpoints文件实现重复运行
安装集群GRID/GI一般包括三个过程:首先,运行OUI/RunInstaller输入集群配置信息,其次,拷贝/编译集群文件,最后,以root用户运行root.sh脚本配置集群/启动集群,其中运行ro ...
- EF+linq的增删改查
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...
- 想转行做web前端工程师,必学这5大技能!知道是那些吗?
web前端工程师是近几年才发展出来的新兴职业,也是目前火爆且高薪的职业. 大需求的市场环境下,出现了越来越多的人群转行做web前端工程师,如设计师.后台程序员.网虫.大学其他专业.策划.编辑等等. 要 ...
- oracle数据比对工具
上半年的工作重心主要是机房搬迁,免不了要经常的数据比对,保证主备库数据一致,为了节约工作时间,提高工作效率,开发了这个数据比对小工具.用起来还可以.有需要的QQ私聊(1603039990),方便大家, ...
- webpack打包性能分析
1. 如何定位webpack打包速度慢的原因 首先需要定位webpack打包速度慢的原因,才能因地制宜采取合适的方案,我们可以在终端输入: webpack --profile --json > ...
- golang 强制重新全部编译
/home/用户名/.cache 删除缓存试试?? 修改的东西老失败 编译结果总不变 神奇了 go build -a -x -v加一句-a 强制重新编译.
- Linux系统GEDIT编译运行C++
作为NOIP第一年强制使用Linux系统的考生,真的很难受,被迫还要学一波Linux系统. 正常的Windows对于较基础的程序员来说非常方便好用,但是对于高级程序员来说就是一个坑,于是就有了Linu ...
- ext笔记
命名 The top-level namespaces and the actual class names should be CamelCased. Everything else shoul ...
- 拖拽大图轮播pc 移动兼容
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- HTML5开发手机应用--viewport的作用--20150216
在用HTML5开发手机应用或手机网页时,<head>部分总会有如下一段代码,这段代码到底什么意思呢.在网上,大家会得到很多答案.我从网上搜集了部分介绍,整理一下,以留备用. <met ...