$NOIP2018$赛道修建
时间:2019-11-14
本文章向大家介绍$NOIP2018$赛道修建,主要包括$NOIP2018$赛道修建使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
树形结构不带树上算法走典型。
用\(DFS\),即可,考虑的方向不能脱离树状结构。
即考虑一棵子树中分出的路线一定是独立的,而那些没用的边可以传上去作为备选答案。
再考虑一个贪心,我们每次上传最大的即可。
#include<bits/stdc++.h>
using namespace std;
namespace AE86
{
const int bufl=1<<15;
char buf[bufl],*s=buf,*t=buf;
inline int fetch()
{
if(s==t){t=(s=buf)+fread(buf,1,bufl,stdin);if(s==t)return EOF;}
return*s++;
}
inline int read()
{
int a=0,b=1,c=fetch();
while(!isdigit(c)) b^=c=='-',c=fetch();
while(isdigit(c)) a=a*10+c-48,c=fetch();
return b?a:-a;
}
}
const int N=5e4+10;
int n,m,num_edge,Sum,Ans;
int head[N<<1],Dis[N];
struct Edge{int next,to,dis;} edge[N<<1];
inline void Add(int from,int to,int dis)
{
edge[++num_edge].next=head[from];
edge[num_edge].dis=dis;
edge[num_edge].to=to;
head[from]=num_edge;
}
inline int Dfs(int pos,int fth,int k)
{
multiset<int> S; S.clear();
for(int i=head[pos];i;i=edge[i].next)
if(edge[i].to!=fth)
{
int Bac=Dfs(edge[i].to,pos,k)+edge[i].dis;
if(Bac>=k) Ans++;
else S.insert(Bac);
}
int Max=0;
while(S.size())
{
if(S.size()==1) return max(Max,*S.begin());
multiset<int>::iterator It=S.lower_bound(k-*S.begin());
if(It==S.begin()&&S.count(*It)==1) It++;
if(It==S.end()) Max=max(Max,*S.begin()),S.erase(*S.begin());
else Ans++,S.erase(It),S.erase(S.begin());
}
return Max;
}
inline bool Check(int k)
{
Ans=0; Dfs(1,0,k);
if(Ans>=m) return 1;
else return 0;
}
inline void Dfs_For_Dia(int pos,int fth)
{
for(int i=head[pos];i;i=edge[i].next)
if(edge[i].to!=fth)
{
Dfs_For_Dia(edge[i].to,pos);
Sum=max(Sum,Dis[pos]+Dis[edge[i].to]+edge[i].dis);
Dis[pos]=max(Dis[pos],Dis[edge[i].to]+edge[i].dis);
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("A.in","r",stdin);
#endif
n=AE86::read(),m=AE86::read();
for(int i=1,U,V,D;i<n;i++)
U=AE86::read(),V=AE86::read(),D=AE86::read(),Add(U,V,D),Add(V,U,D);
Dfs_For_Dia(1,0);int l=0,r=Sum;
while(l<r)
{
int mid=(l+r+1)>>1;
if(Check(mid)) l=mid;
else r=mid-1;
}
printf("%d\n",l);
}
原文地址:https://www.cnblogs.com/wo-shi-zhen-de-cai/p/11857841.html
- yaffs_bitmap
- 原创 | 实战:R环境下Echart的8种可视化
- Yarn(MapReduce 2.0)下分布式缓存(DistributedCache)的注意事项
- Yaffs_guts(三)
- 浅谈 python multiprocessing(多进程)下如何共享变量
- 文件地址映射之yaffs_GetTnode
- bash/shell 解析命令行参数工具:getopts/getopt
- ssh 双机互信:免密码登录设置步骤及常见问题
- yaffs_guts(一)
- 聊聊 Java 中 HashMap 初始化的另一种方式
- 基于 Hive 的文件格式:RCFile 简介及其应用
- MapReduce 计数器简介
- 流水线乘法器
- Hive 基础(2):库、表、字段、交互式查询的基本操作
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 排序算法之快速排序
- 干货 | Oracle数据库操作命令大全,满满的案例供你理解,收藏!
- 【2万字长文】深入浅出主流的几款小程序跨端框架原理
- 关于动态规划的练习题
- Linux笔记
- 使用OpenCV和Python计算视频中的总帧数
- HDOJ 1087 (JAVA实现 最大上升子序列和dp)
- JavaSE笔记
- [译]Gas 优化 - 如何优化存储
- Codeforces Round #613 (Div. 2) C. Fadi and LCM
- N皇后问题(DFS)
- [译]区块链民主 - 如何开发通过投票运行的合约
- java安全编码指南之:异常处理
- java安全编码指南之:死锁dead lock
- java安全编码指南之:方法编写指南