题目大意:一个$n$个点的树,树上有$m$个点对$(a,b)$,找到一个点$x$,使得$max(dis(x,a_i)+dis(x,b_i))$最小

如果做过幻想乡的战略游戏这道题,应该这道题的思路一眼能看出来

首先如果从一个点向能使答案变小的子树上走,那么从子树上一定不会再回到这个点

所以考虑一个暴力,即每次计算所有子树的答案,然后向最优的方向走

这显然是正确的,但是不够优秀

我们再深入分析一下这道题,可以发现,当且仅当所有的距离等于最大值的点对都在它的一个子树内时才可能使得答案变优

很好理解,因为如果不在通一个子树内,不论向任何地方走,总会有点对的最大值变得更大

然后这样我们就可以用点分治的$getroot$来优化这个过程,复杂度为$nlogn$

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define M 100010
using namespace std;
int n,m,num,rt,S,ans=1e9;
int head[M],size[M],maxn[M],bel[M],dis[M],u[M],v[M],st[M];
bool vis[M];
struct point{int to,next,dis;}e[M<<];
void add(int from,int to,int dis)
{
e[++num].next=head[from];
e[num].to=to;
e[num].dis=dis;
head[from]=num;
}
void getroot(int x,int fa)
{
size[x]=maxn[x]=;
for(int i=head[x];i;i=e[i].next)
{
int to=e[i].to;
if(to==fa||vis[to]) continue;
getroot(to,x),size[x]+=size[to];
maxn[x]=max(maxn[x],size[to]);
}
maxn[x]=max(maxn[x],S-size[x]);
if(maxn[x]<maxn[rt]) rt=x;
} void dfs(int x,int fa,int id)
{
bel[x]=id;
for(int i=head[x];i;i=e[i].next)
if(e[i].to!=fa)
{
dis[e[i].to]=dis[x]+e[i].dis;
dfs(e[i].to,x,id);
}
} void solve(int x)
{
if(vis[x]) {printf("%d\n",ans);exit();}
vis[x]=true,dis[x]=;
for(int i=head[x];i;i=e[i].next)
{
dis[e[i].to]=e[i].dis;
dfs(e[i].to,x,e[i].to);
}
int MX=,top=,pos=;
for(int i=;i<=m;i++)
{
if(dis[u[i]]+dis[v[i]]>MX)
{
MX=dis[u[i]]+dis[v[i]];
st[top=]=i;
}
else if(dis[u[i]]+dis[v[i]]==MX)
st[++top]=i;
}
ans=min(ans,MX);
for(int i=;i<=top;i++)
{
if(bel[u[st[i]]]!=bel[v[st[i]]])
{
printf("%d\n",ans);
exit();
}
else
{
if(!pos) pos=bel[u[st[i]]];
else if(pos!=bel[u[st[i]]])
{
printf("%d\n",ans);
exit();
}
}
}
S=size[pos],rt=;
getroot(pos,),solve(rt);
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
{
int a,b,c;scanf("%d%d%d",&a,&b,&c);
add(a,b,c),add(b,a,c);
}
for(int i=;i<=m;i++) scanf("%d%d",&u[i],&v[i]);
S=maxn[]=n,getroot(,),solve(rt);
return ;
}

[洛谷P4886]快递员的更多相关文章

  1. 【洛谷 P4886】 快递员 (点分治)

    这题因为一些小细节还是\(debug\)了很久...不过我第一次用脚本对拍,不亏. 先随便找一个点作为根,算出答案,即所有点对到这个点的距离和的最大值,并记录所有距离最大的点对.如果这个点在任意一个距 ...

  2. 【LGR-051】洛谷9月月赛

    [LGR-051]洛谷9月月赛 luogu 签到题 description 给出\(K\)和质数\(m\),求最小的\(N\)使得\(111....1\)(\(N\)个\(1\))\(\equiv k ...

  3. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  4. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  5. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  6. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  7. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

  8. 洛谷P1371 NOI元丹

    P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交  讨论  题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...

  9. 洛谷P1538迎春舞会之数字舞蹈

    题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...

随机推荐

  1. APNS/苹果推送服务

    Apple Push Notification Service Google Cloud Message/Google 云 消息 Firebase Cloud Messaging

  2. [iOS微博项目 - 4.6] - 微博配图

    github: https://github.com/hellovoidworld/HVWWeibo A.微博配图 1.需求 显示原创微博.转发微博的缩略图 4张图使用2x2布局,其他使用3x3布局, ...

  3. Tomcat启动慢但是不报错的解决办法

    参考文章:https://blog.csdn.net/xiaoxinyu316/article/details/39064003 可以查看下tomat的启动日志,看看有哪些比较耗时的操作: grep ...

  4. oracle的相关信息

    [INS-08109] :https://blog.csdn.net/u012830807/article/details/17302919[INS-13001]:https://blog.csdn. ...

  5. 自己动手写RNN

    说的再好,也不如实际行动,今天手写了一个RNN,没有使用Numpy库,自己写的矩阵运算方法,由于这也只是个学习用的demo,所以矩阵运算那一部分写的比较丑陋,见笑了. import com.mylea ...

  6. 如何设计Spring读取某种文件的逻辑顺序

    1. 判断系统属性System.getProperty("apdb.config.path", "");,有的话,优先使用.(系统属性可以在命令行中以 -D&l ...

  7. TWebBrowser: Determine when a page with Frames is completed

    TWebBrowser: Determine when a page with Frames is completed 6 comments. Current rating: (3 votes). L ...

  8. 『NiFi 学习之路』使用 —— 主要组件的使用

    一.概述 大部分 NiFi 使用者都是通过 NiFi 的 Processor 来实现自己的业务的.因此,我也主要就 NiFi 官方提供的 Porcessor 进行介绍. 二.Processor 如果你 ...

  9. WPS宏不可用解决方法

    在使用WPS Office过程中,遇见宏不可用,在启用宏的过程中提示获取VBA插件 解决方法: 1.下载VBA插件,下载地址:https://pan.baidu.com/s/1LqBmXw37U0km ...

  10. Spring MVC 知识总结

    参考文章:http://www.oschina.net/question/84460_9608 孔浩视频 1. 几个关键类: RequestMappingHandlerMapping 和 Reques ...