bzoj3242
如果是树,那么一定选择树的直径的中点
套了个环?裸的想法显然是断开环,然后求所有树的直径的最小值
环套树dp的一般思路,先把环放到根,把环上点下面的子树dp出来,然后再处理环上的情况
设f[i]表示以i为根的子树向下延伸的最长链长度
我们把环上的点扩展一倍,用前缀和维护环上的边权
依次枚举断点,则对直径影响就是max(s[j]-s[i]+f[i]+f[j])
分别维护max(s[j]+f[j])和max(f[i]-s[i])
注意i≠j,所以我们还要维护一个次小值
type node=record
po,next,num:longint;
end;
link=record
loc:longint;
mx:int64;
end; var tree:array[..*,..] of link;
e:array[..] of node;
cut:array[..] of boolean;
a,b,p,fa:array[..] of longint;
v:array[..] of boolean;
f,s:array[..] of int64;
i,len,n,t,x,y,z:longint;
ll,ans,lin:int64;
l1,l2,tp:link; function max(a,b:int64):int64;
begin
if a>b then exit(a) else exit(b);
end; function min(a,b:int64):int64;
begin
if a>b then exit(b) else exit(a);
end; procedure add(x,y,z:longint);
begin
inc(len);
e[len].po:=y;
e[len].next:=p[x];
e[len].num:=z;
p[x]:=len;
end; procedure find(x:longint);
var i,y,h:longint;
begin
i:=p[x];
while i<>- do
begin
y:=e[i].po;
if not cut[i] then
begin
if fa[y]<> then
begin
h:=x;
while h<>y do
begin
inc(t);
a[t]:=h;
b[t]:=f[h];
h:=fa[h];
end;
inc(t);
a[t]:=h;
b[t]:=e[i].num;
break;
end
else begin
cut[i]:=true;
cut[i xor ]:=true;
fa[y]:=x;
f[y]:=e[i].num;
find(y);
end;
end;
if t<> then break;
i:=e[i].next;
end;
end; procedure dfs(x:longint);
var i,y:longint;
begin
v[x]:=true;
f[x]:=;
i:=p[x];
while i<>- do
begin
y:=e[i].po;
if not v[y] then
begin
dfs(y);
lin:=max(lin,f[y]+f[x]+e[i].num);
f[x]:=max(f[x],f[y]+e[i].num);
end;
i:=e[i].next;
end;
end; procedure update(var c:link; a:link; b:link);
begin
c.mx:=a.mx;
c.loc:=a.loc;
if c.mx<b.mx then
begin
c.loc:=b.loc;
c.mx:=b.mx;
end;
end; procedure build(i,l,r:longint);
var m:longint;
begin
if l=r then
begin
tree[i,].mx:=f[a[l]]+s[l];
tree[i,].loc:=l;
tree[i,].mx:=f[a[l]]-s[l];
tree[i,].loc:=l;
end
else begin
m:=(l+r) shr ;
build(i*,l,m);
build(i*+,m+,r);
update(tree[i,],tree[i*,],tree[i*+,]);
update(tree[i,],tree[i*,],tree[i*+,]);
end;
end; function ask(i,l,r,w,x,y:longint):link;
var m:longint;
s,s1,s2:link;
begin
if (x<=l) and (y>=r) then exit(tree[i,w])
else begin
m:=(l+r) shr ;
if x>m then exit(ask(i*+,m+,r,w,x,y));
if y<=m then exit(ask(i*,l,m,w,x,y));
s1:=ask(i*,l,m,w,x,y);
s2:=ask(i*+,m+,r,w,x,y);
update(s,s1,s2);
exit(s);
end;
end; begin
len:=-;
fillchar(p,sizeof(p),);
readln(n);
for i:= to n do
begin
readln(x,y,z);
add(x,y,z);
add(y,x,z);
end;
fa[]:=-;
find();
for i:= to t do
begin
v[a[i]]:=true;
a[i+t]:=a[i];
b[i+t]:=b[i];
end;
for i:= to *t do
s[i]:=s[i-]+b[i-];
for i:= to t do
dfs(a[i]);
build(,,*t);
ans:=;
for i:= to t do
begin
l1:=ask(,,*t,,i+,i+t);
l2:=ask(,,*t,,i+,i+t);
if l1.loc=l2.loc then
begin
ll:=;
if l1.loc>i+ then
begin
tp:=ask(,,*t,,i+,l1.loc-);
ll:=max(ll,l1.mx+tp.mx);
end;
if l2.loc<i+t then
begin
tp:=ask(,,*t,,l2.loc+,i+t);
ll:=max(ll,l2.mx+tp.mx);
end;
ans:=min(ans,max(ll,lin));
end
else ans:=min(ans,max(l1.mx+l2.mx,lin));
end;
writeln(ans/::);
end.
bzoj3242的更多相关文章
- 【BZOJ3242】【NOI2013】快餐店(动态规划)
[BZOJ3242][NOI2013]快餐店(动态规划) 题面 BZOJ 题解 假设我们要做的是一棵树,那么答案显然是树的直径的一半. 证明? 假设树的直径是\(2d\),那么此时最远点的距离是\(d ...
- BZOJ3242 [Noi2013]快餐店 【环套树 + 单调队列dp】
题目链接 BZOJ3242 题解 题意很清楚,找一点使得最远点最近 如果是一棵树,就是直径中点 现在套上了一个环,我们把环单独拿出来 先求出环上每个点外向树直径更新答案,并同时求出环上每个点外向的最远 ...
- 【BZOJ3242】【UOJ#126】【NOI2013】快餐店
NOI都是这种难度的题怎么玩嘛QAQ 原题: 小T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方. ...
- BZOJ3242/UOJ126 [Noi2013]快餐店
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- bzoj3242 [Noi2013]快餐店
Description 小T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方. 快餐店的顾客分布在城 ...
- BZOJ3242 快餐店
原题传送门 题意 给定一个n条边n个点的连通图,求该图的某一点在该图距离最远的点距离它的距离的最小值. 题解 显然,答案是\(\frac {原图直径}{2}\). 本体的图有 \(n\) 个点 \(n ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
随机推荐
- [搜片神器]winform程序自己如何更新自己的方法代码
DHT抓取程序开源地址:https://github.com/h31h31/H31DHTDEMO 数据处理程序开源地址:https://github.com/h31h31/H31DHTMgr 国外测试 ...
- javascript基础之客户端事件驱动
我们知道,面向对象发展起来后,“一夜之间”,几乎所有的语言都能基于对象了,JavaScript也是基于对象的语言.用户在浏览器上的行为称作“事件”,之后引发的一系列动作,比如弹窗啦,改变浏览器大小啦, ...
- Kali Linux 优化过程
修改输入法横向候选字 vim ~/.config/fcitx/conf fcitx-classic-ui.config 修改此行 为 false :VerticalList=False mb这玩 ...
- CKFinder 1.4.3 任意文件上传漏洞
CKFinder 是国外一款非常流行的所见即所得文字编辑器,其1.4.3 asp.net版本存在任意文件上传漏洞,攻击者可以利用该漏洞上传任意文件. CKFinder在上传文件的时候,强制将文件名(不 ...
- 8个月从CS菜鸟到拿到Google Offer的经历+内推
http://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=77453&page=1&authorid=10377 ...
- hdoj 2112 HDU Today
题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=2112 分析:多了一个地方的条件,用map来映射地点编号,Dijkstra求解即可 //2013-10- ...
- php数组函数序列之array_unshift() 在数组开头插入一个或多个元素
array_unshift() 函数在数组开头插入一个或多个元素.被加上的元素作为一个整体添加,这些元素在数组中的顺序和在参数中的顺序一样 array_unshift()定义和用法 array_uns ...
- SDUT2484算术表达式的转换
http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2484&cid=1182 题目描述 小明在学习了数据结构之后,突然想起了以前没有解决的算术 ...
- 荣耀3X畅玩版狙击红米note!
华为与小米的战争史,可以追溯到 红米 799,华为独立初荣耀品牌推出荣耀3C,定价798,就是比你少一快; 小米3 定价1999,华为出荣耀3X,定价1980; 最近的红米Note,标配版定价799, ...
- XML中如何使用schema
Schema简介 DTD的语法相当复杂,并且它不符合XML文件的标准,自成一个体系,W3C定义的Schema用来代替DTD. chema相对于DTD的明显好处是XML Schema文档本身也是XML文 ...