Luogu_4886 快递员

一道淀粉质的题目。

先考虑最简单的算法,那便是对每个点都求一边。时间复杂度O(NM)

然后如果我们把每个点的结果对应一个高度,我们会发现。最优解是在这个对应高度形成的三维图像中的谷底(谷缝)

也就数说,对于一条链来说,他是一个开口向上的类似二次函数的一个图形。

具有类似单调性的一类性质。

在O(NM)的算法中,可以使用其剪枝。既是如果相邻的节点的答案要大于当前节点,那么我们就不向那个节点进行搜索。

为什么? 如果相邻节点的答案小于当前点,那么说明,当前的最长链的两端都在相邻节点所确定的子树中。

所以我们往这颗子树中走就用可能是更优的。(随时取min)

为什么说是可能?因为这个最长链的位置可能改动。


对于这个二次函数图像,我们可以使用一个类似二分的方法,在log时间复杂度中找到最小值。

就是前文说的类似单调性一样的东西。

所以我们可以利用最长连所在的子树的重心进行检验。

因为重心的性质,我们就可以每次将问题至少缩小一半规模。

至于什么时候退出呢?

要么递归到底,要么子树重心的答案大于当前最优答案。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring> using std::min;
using std::max; const int maxn=101000;
const int inf=0x7fffffff; struct node
{
int p;
int value;
int nxt;
}; node line[maxn<<1];
int head[maxn],tail;
int query[maxn][2];
int vis[maxn],dis[maxn],size[maxn],f[maxn];
int belong[maxn];
int n,m,root,sum;
int ans,where; int read()
{
char c=getchar();
int res=0;
while(c>'9'||c<'0') c=getchar();
while(c>='0'&&c<='9')
{
res=(res<<1)+(res<<3)+c-'0';
c=getchar();
}
return res;
} void add(int a,int b,int c)
{
line[++tail].p=b;
line[tail].value=c;
line[tail].nxt=head[a];
head[a]=tail;
return ;
} void get_dis(int now,int fa,int Dis,int Belong)
{
dis[now]=Dis;
belong[now]=Belong;
for(int i=head[now];i;i=line[i].nxt)
{
int v=line[i].p;
if(v==fa) continue;
get_dis(v,now,Dis+line[i].value,Belong);
}
return ;
} void get_size(int now,int fa)
{
size[now]=1;
for(int i=head[now];i;i=line[i].nxt)
{
int v=line[i].p;
if(vis[v]||v==fa) continue;
get_size(v,now);
size[now]+=size[v];
}
return ;
} void get_hry(int now,int fa)
{
size[now]=1;f[now]=0;
for(int i=head[now];i;i=line[i].nxt)
{
int v=line[i].p;
if(vis[v]||v==fa) continue;
get_hry(v,now);
size[now]+=size[v];
f[now]=max(f[now],size[v]);
}
f[now]=max(f[now],sum-size[now]);
if(f[now]<f[root]) root=now;
return ;
} void solve(int now)
{
sum=size[now];
root=0;
get_hry(now,0);
int Max=0,Be=0,cnt=0;
vis[root]=1;get_size(root,0);
belong[root]=dis[root]=0;
for(int i=head[root];i;i=line[i].nxt)
get_dis(line[i].p,root,line[i].value,++cnt);
for(int i=1;i<=m;i++)
Max=max(Max,dis[query[i][0]]+dis[query[i][1]]);
ans=min(ans,Max);
// if(ans>Max)
// {
// ans=Max;
// where=root;
// }
for(int i=1;i<=m;i++)
{
int A=query[i][0],B=query[i][1];
if(dis[A]+dis[B]!=Max) continue;
if(belong[A]==belong[B]&&(!Be||Be==belong[A]))
Be=belong[A];
else if((!belong[A]||!belong[B])&&(!Be||Be==belong[A]+belong[B]))
Be=belong[A]+belong[B];
else return ;
}
for(int i=head[root];i;i=line[i].nxt)
if(!vis[line[i].p]&&Be==belong[line[i].p])
{
solve(line[i].p);
return ;
}
return ;
} int main()
{
n=read();m=read();
for(int i=1,a,b,c;i<n;i++)
{
a=read();b=read();c=read();
add(a,b,c);
add(b,a,c);
}
for(int i=1;i<=m;i++)
query[i][0]=read(),query[i][1]=read();
f[0]=inf;size[1]=n;ans=inf;
solve(1);
printf("%d",ans);
//printf("\n%d",where);
}

Luogu_4886 快递员的更多相关文章

  1. easyUI定区关联快递员js代码

    easyUI定区关联快递员js代码: <script type="text/javascript"> $.fn.serializeJson=function(){ va ...

  2. Android动画之仿美团加载数据等待时,小人奔跑进度动画对话框(附顺丰快递员奔跑效果)

    Android动画之仿美团加载数据等待时,小人奔跑进度动画对话框(附顺丰快递员奔跑效果) 首句依然是那句老话,你懂得! finddreams :(http://blog.csdn.net/finddr ...

  3. 项目一:第七天 CRM 和bos系统实现定区关联客户,关联快递员. 通过CXF框架实现

    定区关联客户 需求:为了快递方便客户下订单(发快递),派快递员上门取件.  所以说需要让定区关联客户(知道客户属于哪个定区),定区跟快递员关系:多对多.知道让哪个快递员上门取件. 将CRM系统中,客户 ...

  4. 项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据

    1. 快递员的条件分页查询-noSession,条件查询 2. 快递员删除(逻辑删除) 3. 基于Apache POI实现批量导入区域数据 a) Jquery OCUpload上传文件插件使用 b) ...

  5. 项目一:第三天 收派标准添加 收派标准分页查询(基于datagrid实现) 收派标准修改快递员添加 快递员列表查询

    1.收派标准添加 n jQuery easyUI window使用 n jQuery easyUI form表单校验 n 收派标准添加页面调整—url params n 服务端实现—三层 2.jQue ...

  6. 【题解】P4886快递员

    [题解]P4886 快递员 淀粉质好题!!!加深了我对点分治的理解.最近分治学了好多啊. 题目大意 给定你一颗有边权的树,再给你\(m\)和点对,请你在树上选出来一个点,使得所有点对到这个点的距离的最 ...

  7. [P4886] 快递员

    考虑在树上选个点rt作为根,并且快递中心就选这儿.计算出所有配送的代价(2*两段之和),设他们的最大值为Max.若此时存在下列情况时,可以判定Max已经为最优解. 1)存在代价为Max的配送(u,v) ...

  8. Luogu4886 快递员 点分治

    传送门 淀粉质好题啊qaq 我们先考虑随便选择一个点作为邮递中心,通过移动邮递中心找到更优的位置.将路径最大值求出,并将路径最大值对应的那一些路径拿出来考虑.可以知道,如果说这些路径中存在一条经过当前 ...

  9. 【LGP4886 】快递员

    题目 好秒啊,真是一道神仙的点分治 于是我们来一个暴力的\(O(nlog^2n)\)的暴力统计吧 考虑计算每一个点作为快递中心时的答案 我们考虑在这个点成为分治重心时计算这个贡献 把这个贡献分成两部分 ...

随机推荐

  1. Delegate背后的秘密

    表面上看来使用delegate是一件很简单的事. 用delegate关键字定义,使用老套的new创建一个instance ,使用熟悉的方法调用写法调用,只不过不在是方法名,而是委托名. 但是在这背后C ...

  2. JavaScript 工具库:Cloudgamer JavaScript Library v0.1 发布

    JavaScript 工具库:Cloudgamer JavaScript Library v0.1 发布   研究了一年多的js,也差不多写一个自己的js库了.我写这个不算框架,只是一个小型的js工具 ...

  3. window.event.srcElement与window.event.target 触发事件的元素 触发事件对象的获取,window.event与时间函数参数的event是同一个 事件对象

    判断事件触发的元素:     var tag = window.event.target || window.event.srcElement;    if (tag.tagName.toLowerC ...

  4. Oracle客户端安装以及PL/SQL Developer安装方法

    1,安装Oracle客户端 2,配置数据库,如下: 安装路径:D:\app\ThinkPad\product\11.2.0\client_1\network\admin 建立文件:tnsnames.o ...

  5. 【转】fatal error C1189: #error : missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS

    转自:http://blog.csdn.net/friendan/article/details/46576699 fatal error C1189: #error :  missing -D__S ...

  6. centos下运行python3.6+Django+mysql项目

    文件准备: Django项目 myslq安装 关闭防火墙 用xshell拖拽到centos上 安装文件: 安装python3.6(3.7有问题) sh install_py36.sh 关闭防火墙 sh ...

  7. python基础——操作系统简介

    不同应用领域的主流操作系统 l  桌面操作系统 l  服务器操作系统 l  嵌入式操作系统 l  移动设备操作系统 桌面操作系统 Windows系列 用户群体很大 MacOS 适合于开发人员 Linu ...

  8. Mysql常用的锁机制

    一.引言                                                                                                 ...

  9. 4星|《助推(实践版)》:英国政府用AB测试检验政策效果的经验

    助推:小行动如何推动大变革(实践版)(诺贝尔经济学奖得主理查德•塞勒的助推实践) 作者作为学者说服英国政府实施助推策略的经过,提到一些具体主推策略. 所谓的助推,很像IT业流行的AB测试,对政策的执行 ...

  10. WebDriverException: Message: A session is either terminated or not started

    错误提示: …… [debug] [XCUITest] Connection to WDA timed out[debug] [iProxy] recv failed: Operation not p ...