庭中有奇树:很多算法揉在一起的好题。

转化题意

因为要封锁 \(m\) 条路径,根据贪心思想,他一定会封锁最短的 \(m\) 条路径。所以我们能走的最短传送路径就是最短的第 \(m+1\) 条路径。

这应该是本题最关键的一步转化了,几个月前降智了根本没想到这个。

做法

求第 \(m+1\) 短的路径,这个很显然通过二分求解,求出最后一个比它小的数的个数小于 \(m+1\) 个的数。

二分 check 函数的实现也是容易的,我们从起点 \(s\) 与终点 \(t\) 各自做一遍 dfs 求出两个点与其他点之间的距离,然后按路径长度从小到大排序。注意这时候要记录下标以进行相邻点传送与同点转送的特判。

接下来我们对于每一个传送起点,通过双指针维护最后一个小于 \(dis\) 的指针 \(p\) 计算出该点的贡献,最后遍历与该点相邻的点,判断他们是否被统计进答案,如果被统计进了就删掉这个贡献即可。注意自己传送到自己的情况也要特判。

答案在传送路径、直接走的路径和直接从 \(s\) 传送到 \(t\) 的 \(10^9\) 代价里取最小值即可。

时间复杂度 \(O(n \log v)\)。

代码

细节挺多的,尤其是 check 函数。

#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pi;
int n,m,k,s,t;
struct edge{
int to,w;
};
struct node{
ll w,id;
}d[2][100005];
ll td[100005];
vector<edge>g[100005];
bool cmp(node a,node b)
{
return a.w<b.w;
}
void dfs(int u,int fa,int mode)
{
for(auto eg:g[u])
{
int v=eg.to,w=eg.w;
if(fa==v)continue;
d[mode][v].w=d[mode][u].w+w;
dfs(v,u,mode);
}
}
ll check(ll dis)
{
ll res=0,p=n;
for(int i=1;i<=n;i++)
{
while(p>0&&d[0][i].w+d[1][p].w>=dis)p--;
res+=p;
int u=d[0][i].id;
for(auto eg:g[u])
{
int v=eg.to;
if(d[0][i].w+td[v]<dis)res--;
}
if(d[0][i].w+td[u]<dis)res--;
}
return res;
}
int main()
{
//freopen("sample.in","r",stdin);
//freopen("sample.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>k>>s>>t;
for(int i=1;i<n;i++)
{
int u,v,w;
cin>>u>>v>>w;
g[u].push_back({v,w});
g[v].push_back({u,w});
}
dfs(s,0,0);
dfs(t,0,1);
for(int i=1;i<=n;i++)
{
d[0][i].id=i;
d[1][i].id=i;
td[i]=d[1][i].w;
}
sort(d[0]+1,d[0]+n+1,cmp);
sort(d[1]+1,d[1]+n+1,cmp);
ll l=0,r=1e18,mid;
while(l<r)
{
mid=(l+r+1)>>1;
if(check(mid)<m+1)l=mid;
else r=mid-1;
}
ll ans=min(ll(1e9),min(l+k,td[s]));
cout<<ans;
return 0;
}

Luogu P10838 『FLA - I』庭中有奇树 题解 [ 绿 ] [ 二分 ] [ 双指针 ] [ 树的遍历 ]的更多相关文章

  1. 似魔鬼的 『 document.write 』

    在平时的工作中,楼主很少用 document.write 方法,一直觉得 document.write 是个危险的方法.楼主不用,并不代表别人不用,最近给维护的项目添了一点代码,更加深了我对 &quo ...

  2. 拾遗:『Linux Capability』

    『Linux Capability』 For the purpose of performing permission checks, traditional UNIX implementations ...

  3. 『创意欣赏』20款精致的 iOS7 APP 图标设计

    这篇文章给大家分享20款精致的 iOS7 移动应用程序图标,遵循图形设计的现代潮流,所有图标都非常了不起,给人惊喜.通过学习这些移动应用程序图标,设计人员可以提高他们的创作,使移动用户界面看起来更有趣 ...

  4. 『设计前沿』14款精致的国外 iOS7 图标设计示例

    每天都有大量的应用程序发布到 iOS App Store 上,在数量巨大的应用中想要引起用户的主要,首要的就是独特的图标设计.这篇文章收集了14款精致的国外 iOS7 图标设计示例,希望能带给你设计灵 ...

  5. Github 恶搞教程(一起『玩坏』自己的 Github 吧)

    最近在伯乐在线读到一篇趣文,<如何在 Github『正确』做贡献>,里面各种能人恶搞 Github 的『Public contributions』,下面截取几个小伙伴的战绩: 顺藤摸瓜,发 ...

  6. 『创意欣赏』30幅逼真的 3D 虚拟现实环境呈现

    又到周末了,给大家分享30幅漂亮的 3D 虚拟现实环境呈现,放松一下.这些创造性的场景都是通过 3D 图形设计软件,结合三维现实环境渲染制作出来的.一起欣赏:) 您可能感兴趣的相关文章 20幅温馨浪漫 ...

  7. [TYVJ1827]『Citric II』一道防AK好题

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 第二届『Citric杯』NOIP提高组模拟赛第一题 描述 Lemon认为在第一届『Citric』杯模拟赛中出的 ...

  8. 办理滑铁卢大学(本科)学历认证『微信171922772』UW学位证成绩单使馆认证University of Waterloo

    办理滑铁卢大学(本科)学历认证『微信171922772』UW学位证成绩单使馆认证University of Waterloo QQ/微信171922772办理毕业证成绩单.真实使馆及教育部学历认证★诚 ...

  9. 办理渥太华大学(本科)学历认证『微信171922772』Ottawa U学位证成绩单使馆认证University of Ottawa

    办理渥太华大学(本科)学历认证『微信171922772』Ottawa U学位证成绩单使馆认证University of Ottawa QQ/微信171922772办理毕业证成绩单.真实使馆及教育部学历 ...

  10. 办理布鲁克大学(本科)学历认证『微信171922772』Brock学位证成绩单使馆认证Brock University

    办理布鲁克大学(本科)学历认证『微信171922772』Brock学位证成绩单使馆认证Brock University [寻-求-当-地-合-作-代-理-人-员] 丨Q微-1719-22772丨學丨历 ...

随机推荐

  1. API之接口服务

    聚合数据: https://www.juhe.cn/ 百度api市场: https://apis.baidu.com/

  2. NFS服务搭建过程

    NFS服务 [1].nfs配置 作用: 解决数据一致性问题 NFS服务程序的配置文件为/etc/exports,需要严格按照共享目录的路径 允许访问的NFS客户端(共享权限参数)格式书写,定义要共享的 ...

  3. shp文件及附属

    主文件 .shp - 用于存储要素几何的主文件,之前分享过该文件的结构详解:必需文件. .shx - 用于存储要素几何索引的索引文件:必需文件. .dbf - 用于存储要素属性信息的 dBASE 表, ...

  4. Swagger 调试,我不想再复制粘贴token啦~

    作为后端开发,进行Web Api 调试,除了使用 Postman, Apifox 等 Web Api 调试工具之外,我想使用Swagger进行调试应该是更方便,更常用的方式了吧. 那么在需要 toke ...

  5. R数据分析,codewar的年终总结,和一周年总结,寒假快乐呀

    前阵子单位各个部门都在要求弄总结,想想自己这个公众号也写了快一年了,专门回去翻了翻,这个公众号发布的第一篇文章是在2021年的1月17日,我想2022年的1月17日我就把现在敲的文字推出来吧,也算是一 ...

  6. 创建没有构造函数的NumberFormat

    我有以下课程: import java.text.NumberFormat; public static class NF { public static NumberFormat formatSha ...

  7. [转]xmanager和xshell什么关系 xmanager怎么使用

    xmanager是一款小巧实用且运行于Windows系统上的X服务器软件,可以帮助用户快速连接并访问Unix/Linux服务器.那xmanager和xshell什么关系,xmanager怎么使用,本文 ...

  8. 比较IDEA与Eclipse

    在IDEA的项目中,聚合工程或普通的根目录是工程(Project).它的每一个子模块(Module),都可以使用独立的JDK和Maven.下面的子工程称为模块(Module),子模块(Module)之 ...

  9. WorldWind源码剖析系列:WorldWind瓦片调度策略说明

    1 基于源码的分析 首先我们来看WorldWind中摄像头变化相关的几个方法的内部逻辑. 1.1 NltTerrainAccessor. GetElevationAt 方法声明:public over ...

  10. C51--05---LCD1602调试工具

    一.LCD1602调试工具 单片机调试工具: 数码管 液晶屏 串口 数码管需要不断进行扫描,一旦扫描不及时就会不断闪烁,并且可显示的数据太过局限: 串口需要使用电脑进行发送指令,不易操作与携带: 所以 ...