[NOIP2018TG]赛道修建
[NOIP2018TG]赛道修建
考场上multiset调不出啊啊啊!!!
首先肯定是二分答案
做树形dp,f[i]表示i点的子树两两匹配后剩下的最长长度
匹配可以用multiset维护
但是菊花图跑得很慢
考虑求出树的直径作为二分上界
#include<bits/stdc++.h>
using namespace std;
const int _=5e4+5;
int re(){
int x=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
}
int n,m,cnt,t,l,r,mid,tot,ans;
int h[_],f[_];
multiset<int>s[_];
multiset<int>::iterator it,ir;
struct edge{int to,next,w;}e[_<<1];
void link(int u,int v,int w){
e[++cnt]=(edge){v,h[u],w};h[u]=cnt;
e[++cnt]=(edge){u,h[v],w};h[v]=cnt;
}
void qd(int u,int fa,int len){
if(len>r)r=len,t=u;
for(int i=h[u];i;i=e[i].next){
int v=e[i].to;
if(v^fa)qd(v,u,len+e[i].w);
}
}
void dfs(int u,int fa){
s[u].clear();f[u]=0;
for(int i=h[u];i;i=e[i].next){
int v=e[i].to;if(v==fa)continue;
dfs(v,u);
if(f[v]+e[i].w>=mid)tot++;
else s[u].insert(f[v]+e[i].w);
}
if(!s[u].size())return;
while(s[u].size()>1){
it=s[u].begin();s[u].erase(it);
ir=s[u].lower_bound(mid-(*it));
if(ir==s[u].end()){f[u]=*it;continue;}
s[u].erase(ir);tot++;
}
if(s[u].size()==1)f[u]=*(s[u].begin());
}
int main(){
n=re(),m=re();
for(int i=1,u,v,w;i<n;i++){
u=re(),v=re(),w=re();
link(u,v,w);
}
qd(1,0,0);qd(t,0,0);
while(l<=r){
tot=0;mid=(l+r)>>1;dfs(1,0);
if(tot>=m)ans=mid,l=mid+1;
else r=mid-1;
}
printf("%d\n",ans);
return 0;
}
[NOIP2018TG]赛道修建的更多相关文章
- Luogu5021 [NOIP2018]赛道修建
Luogu5021 [NOIP2018]赛道修建 一棵大小为 \(n\) 的树,边带权.选 \(m\) 条链使得长度和最小的链最大. \(m<n\leq5\times10^4\) 贪心,二分答案 ...
- [NOIp2018提高组]赛道修建
[NOIp2018提高组]赛道修建 题目大意: 给你一棵\(n(n\le5\times10^4)\)个结点的树,从中找出\(m\)个没有公共边的路径,使得第\(m\)长的路径最长.问第\(m\)长的路 ...
- noip2018 D1T3 赛道修建
题目描述 C 城将要举办一系列的赛车比赛.在比赛前,需要在城内修建 mm 条赛道. C 城一共有 nn 个路口,这些路口编号为 1,2,…,n1,2,…,n,有 n-1n−1 条适合于修建赛道的双向通 ...
- noip 2018 D1T3 赛道修建
noip 2018 D1T3 赛道修建 首先考虑二分答案,这时需要的就是对于一个长度求出能在树中选出来的最多的路径条数.考虑到一条路径是由一条向上的路径与一条向下的路径构成,或者仅仅是向上或向下的路径 ...
- 【LG5021】[NOIP2018]赛道修建
[LG5021][NOIP2018]赛道修建 题面 洛谷 题解 NOIP之前做过增强版还没做出来\(QAQ\) 一看到题目中的最大值最小,就很容易想到二分答案 重点是考虑如何\(check\) 设\( ...
- 【noip2018】【luogu5021】赛道修建
题目描述 C 城将要举办一系列的赛车比赛.在比赛前,需要在城内修建 mm 条赛道. C 城一共有 nn 个路口,这些路口编号为 1,2,…,n1,2,…,n,有 n-1n−1 条适合于修建赛道的双向通 ...
- 竞赛题解 - NOIP2018 赛道修建
\(\mathcal {NOIP2018}\) 赛道修建 - 竞赛题解 额--考试的时候大概猜到正解,但是时间不够了,不敢写,就写了骗分QwQ 现在把坑填好了~ 题目 (Copy from 洛谷) 题 ...
- 【题解】 P5021赛道修建
[题解]P5021 赛道修建 二分加贪心,轻松拿省一(我没有QAQ) 题干有提示: 输出格式: 输出共一行,包含一个整数,表示长度最小的赛道长度的最大值. 注意到没,最小的最大值,还要多明显? 那么我 ...
- P5021 赛道修建[贪心+二分]
题目描述 C 城将要举办一系列的赛车比赛.在比赛前,需要在城内修建 mm 条赛道. C 城一共有 nn 个路口,这些路口编号为 1,2,-,n1,2,-,n,有 n-1n−1 条适合于修建赛道的双向通 ...
随机推荐
- shell脚本循环嵌套
嵌套循环 在循环语句内使用任意类型的命令,包括其他循环命令,叫做嵌套循环.因为是在迭代中迭代,需要注意变量的使用以及程序的效率问题. 下面举一个for循环嵌套for循环的例子: wangsx@SC-2 ...
- 通过内存映射文件来颠倒文本内容(暂没有处理Unicode和换行符)
// ReverseFileDemo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <windows.h> ...
- nginx跨域(转2)
当出现403跨域错误的时候 No 'Access-Control-Allow-Origin' header is present on the requested resource,需要给Nginx服 ...
- Dapper用法小记
https://github.com/StackExchange/Dapper dapper in 查询 string sql = "SELECT * FROM SomeTable WHER ...
- android launcher2开发之 有抽屉改成无抽屉
在launcher.java中在createShortcut方法中 屏蔽全部应用button 修改之前 View createShortcut(int layoutResId, ViewGroup ...
- socket编程之多次收发数据
客户端: #-*- coding:utf-8 -*- #客户端程序 import socket client = socket.socket() #1.创建一个客户端对象 client.connect ...
- 李洪强iOS下的实际网络连接状态检测
iOS下的实际网络连接状态检测 序言 网络连接状态检测对于我们的iOS app开发来说是一个非常通用的需求.为了更好的用户体验,我们会在无网络时展现本地或者缓存的内容,并对用户进行合适的提示.对绝大部 ...
- python 第三方库下载地址
http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml
- java包命名规则
package indi/onem.发起者名.项目名.模块名... package pers.个人名.项目名.模块名... package priv.个人名.项目名.模块名... package te ...
- c++ using Handle Class Pattern to accomplish implementation hiding
Reference material: Thinking In C++ 2nd eidition chapter 5 section "Handle classes" If the ...