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. IDEA使用maven建web项目示例

    运行环境:OSX-10.13.3. IDEA-2017.3.3. maven-3.5.2 步骤1:选择maven-webapp模板新建web项目 步骤2:设置项目GroupId等 需从网上下载相关构件 ...

  2. 通用CSS命名规范

    一.文件命名规范 样式文件命名主要的 master.css布局,版面 layout.css专栏 columns.css文字 font.css打印样式 print.css主题 themes.css [/ ...

  3. html和css入门 (一)

    HTML简介 什么是HTML HTML 的全称为 超文本标记语言(Hyper Text Markup Language),这种语言给我们提供一种建立结构性文档的方法.通过表示结构性的标签语法,我们可以 ...

  4. js 控制页面跳转的5种方法

    js 控制页面跳转的5种方法 编程式导航: 点击跳转路由,称编程式导航,用js编写代码跳转. History是bom中的 History.back是回退一页 Histiory.go(1)前进一页 Hi ...

  5. IoT Gateway Based on OSGi

    1. OSGi Knowleage 2. OSGi.Net on Windows 3. OSGi with JAVA 4. OSGi with Qt and C++ 5. Architecture o ...

  6. 使用 npm 安装 Vue

    使用 npm 安装 Vue 需要 node.js 就不多说了(从 nodejs.org 中下载 nodejs ) (1)安装 Vue,在 cmd 里直接输入: npm install -g cnpm ...

  7. 算法day01

  8. vs的一个奇葩错误 : 未能找到任何适合于指定的区域性或非特定区域性的资源...

    摘要: VS2005下进行开发的时候遇到的问头:未能找到任何适合于指定的区域性或非特定区域性的资源.请确保在编译时已将“xxx.Form1.resources”正确嵌入或链接到程序集“xxx”,或者确 ...

  9. [BZOJ 2510]弱题

    2510: 弱题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 419  Solved: 226[Submit][Status][Discuss] D ...

  10. codeforces 808G Anthem of Berland

    codeforces 808G Anthem of Berland 题面 给定\(s\)串和\(t\)串,字符集是小写字母.\(s\)串中有些位置的值不确定,要求你确定这些位置上的值,使得\(t\)在 ...