BZOJ4379 : [POI2015]Modernizacja autostrady
两遍树形DP求出每个点开始往上往下走的前3长路以及每个点上下部分的直径。
枚举每条边断开,设两边直径分别为$A,B$,则:
对于第一问,连接两边直径的中点可得直径为$\max(A,B,\lfloor\frac{A+1}{2}\rfloor+\lfloor\frac{B+1}{2}\rfloor+1)$的新树。
对于第二问,连接两边直径的端点可得直径为$A+B+1$的新树。
时间复杂度$O(n)$。
#include<cstdio>
#define N 500010
int n,i,j,x,y,g[N],v[N<<1],nxt[N<<1],del[N<<1],ed,fa[N];
int d[N][3],f[N],w[N][2],u[N],h[N],ans1=N,ans2,ch1,ch2,id,dis[N],pre[N],q[N];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
inline void up(int&a,int b){if(a<b)a=b;}
inline int max(int a,int b){return a>b?a:b;}
void caldown(int x){
for(int i=g[x];i;i=nxt[i])if(v[i]!=fa[x]){
int y=v[i];
fa[v[i]]=x;
caldown(v[i]);
int t=d[y][0]+1;
if(t>d[x][0])d[x][2]=d[x][1],d[x][1]=d[x][0],d[x][0]=t;
else if(t>d[x][1])d[x][2]=d[x][1],d[x][1]=t;
else if(t>d[x][2])d[x][2]=t;
up(f[x],t=f[y]);
if(t>w[x][0])w[x][1]=w[x][0],w[x][0]=t;else if(t>w[x][1])w[x][1]=t;
}
up(f[x],d[x][0]+d[x][1]);
}
void calup(int x){
if(x!=1){
int y=fa[x];
u[x]=u[y];
up(u[x],d[y][0]==d[x][0]+1?d[y][1]:d[y][0]);
u[x]++;
h[x]=h[y];
up(h[x],w[y][0]==f[x]?w[y][1]:w[y][0]);
int a,b,c=u[y];
if(d[y][0]==d[x][0]+1)a=d[y][1],b=d[y][2];
else a=d[y][0],b=d[y][1]==d[x][0]+1?d[y][2]:d[y][1];
up(h[x],a+b),up(h[x],a+c),up(h[x],b+c);
int t=max(max(h[x],f[x]),(h[x]+1)/2+(f[x]+1)/2+1);
if(t<ans1)ans1=t,ch1=x;
t=h[x]+f[x]+1;
if(t>ans2)ans2=t,ch2=x;
up(h[x],a+1),up(h[x],b+1),up(h[x],c+1);
}
for(int i=g[x];i;i=nxt[i])if(v[i]!=fa[x])calup(v[i]);
}
void dfs(int x,int y){
pre[x]=y;
if(dis[x]>dis[id])id=x;
for(int i=g[x];i;i=nxt[i])if(v[i]!=y&&!del[i])dis[v[i]]=dis[x]+1,dfs(v[i],x);
}
int main(){
read(n);
for(i=1;i<n;i++)read(x),read(y),add(x,y),add(y,x);
caldown(1),calup(1);
printf("%d %d %d",ans1,ch1,fa[ch1]);
for(i=g[ch1];i;i=nxt[i])if(v[i]==fa[ch1])del[i]=1;
for(i=g[fa[ch1]];i;i=nxt[i])if(v[i]==ch1)del[i]=1;
dfs(id=ch1,dis[ch1]=0);
dfs(id,dis[id]=0);
for(i=1;id;i++,id=pre[id])q[i]=id;
printf(" %d",q[i>>1]);
dfs(id=fa[ch1],dis[fa[ch1]]=0);
dfs(id,dis[id]=0);
for(i=1;id;i++,id=pre[id])q[i]=id;
printf(" %d\n",q[i>>1]);
for(i=g[ch1];i;i=nxt[i])if(v[i]==fa[ch1])del[i]=0;
for(i=g[fa[ch1]];i;i=nxt[i])if(v[i]==ch1)del[i]=0;
printf("%d %d %d",ans2,ch2,fa[ch2]);
for(i=g[ch2];i;i=nxt[i])if(v[i]==fa[ch2])del[i]=1;
for(i=g[fa[ch2]];i;i=nxt[i])if(v[i]==ch2)del[i]=1;
dfs(id=ch2,dis[ch2]=0);
printf(" %d",id);
dfs(id=fa[ch2],dis[fa[ch2]]=0);
printf(" %d",id);
return 0;
}
BZOJ4379 : [POI2015]Modernizacja autostrady的更多相关文章
- [BZOJ4379][POI2015]Modernizacja autostrady[树的直径+换根dp]
题意 给定一棵 \(n\) 个节点的树,可以断掉一条边再连接任意两个点,询问新构成的树的直径的最小和最大值. \(n\leq 5\times 10^5\) . 分析 记断掉一条边之后两棵树的直径为 \ ...
- 【BZOJ4379】[POI2015]Modernizacja autostrady 树形DP
[BZOJ4379][POI2015]Modernizacja autostrady Description 给定一棵无根树,边权都是1,请去掉一条边并加上一条新边,定义直径为最远的两个点的距离,请输 ...
- @bzoj - 4379@ [POI2015] Modernizacja autostrady
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一棵无根树,边权都是1,请去掉一条边并加上一条新边,定义直径 ...
- POI2015题解
POI2015题解 吐槽一下为什么POI2015开始就成了破烂波兰文题目名了啊... 咕了一道3748没写打表题没什么意思,还剩\(BZOJ\)上的\(14\)道题. [BZOJ3746][POI20 ...
- [Poi2015]
[POI2015]Łasuchy 一看以为是sb题 简单来说就是每个人获得热量要尽量多 不能找别人 首先这道题好像我自己找不到NIE的情况 很容易想到一个优化 如果一个数/2>另一个数 那么一定 ...
- Work at DP
转载请注明出处:http://www.cnblogs.com/TSHugh/p/8858805.html Prepared: (无notes的波兰题目的notes见我的波兰题目补全计划)BZOJ #3 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- poi2015 bzoj4377-4386训练
就按时间顺序写吧 完成度:10/10 3.30 bzoj4385 首先一定是删去连续d个数,然后枚举终点,起点显然有单调性,用单调队列乱搞搞就可以啦 bzoj4378 首先才结论:可行当且仅当把所有大 ...
- BZOJ 4385: [POI2015]Wilcze doły
4385: [POI2015]Wilcze doły Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 648 Solved: 263[Submit][ ...
随机推荐
- iOS - HTTPS接口加密和身份认证
为什么要使用HTTPS代替HTTP HTTPS和HTTP的区别 https协议需要到CA申请证书,一般免费证书很少,需要交费. http是超文本传输协议,信息是明文传输,https则是具有安全性的SS ...
- php 注册审核
注册界面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- VS使用技巧(转)
转自http://www.cnblogs.com/xpvincent/p/3596553.html i. Ctrl-M-O 折叠所有方法 ii. Ctrl-M-P 展开所有方法并停止大纲显示(不可以再 ...
- jQuery Moblie 学习之page、button、theme、panel、listview、controlgroup、navbar等(一)
1.jQTouch jQTouch与jQuery Moblie十分相似,也是一个jQuery插件,同样也支持HTML页面标签驱动,实现移动设备视图切换效果.不同的是它是专为WebKit内核的浏览器打造 ...
- CXF学习(4) 处理无法自动转换的复合数据类型
只贴出服务端代码 1.Service接口类 package com.test.hello; import java.util.Map; import javax.jws.WebService; imp ...
- git push 使用总结
git push命令用于将本地分支的更新,推送到远程主机.它的格式与git pull命令相仿. $ git push <远程主机名> <本地分支名>:<远程分支名> ...
- yaf框架使用(centos6.5)
安装好php环境之后 安装扩展包 $yum install php-devel /usr/bin/ 就会出现phpize工具包 下载yaf-2.2.8.gz源文件,解压后,进入源文件 phpize [ ...
- 6-03使用SQL语句一次型向表中插入多行数据
通过将现有表中的数据添加到已存在的表中: INSERT INTO <表名><列名> SELECT<列名> FROM<源表名> 将UserInfo的数据添 ...
- Session 类
Session 类 Session 类可以使用户在浏览您的网站时,维持他们的状态并跟踪他们的行为. Session 类将每个用户的 session 信息序列化(serialize)后存储到到 coo ...
- zzy:请求静态资源和请求动态资源, src再次请求服务器资源
[总结可以发起请求的阶段:请求动态资源:通过web.xml匹配action然后,自定义Servlet处理该action1)form表单提交请求的时候,用action设定,该页面发起请求的Servlet ...