【LG5021】[NOIP2018]赛道修建

题面

洛谷

题解

NOIP之前做过增强版还没做出来\(QAQ\)

一看到题目中的最大值最小,就很容易想到二分答案

重点是考虑如何\(check\)

设\(dp[x]\)表示在\(x\)的子树中未被选过的权值最大的路径权值为多少

对于其子节点\(v\),它满足\(f[v] + cost[u][v] >= mid\)就可以选择

否则再选一条路径和它拼在一起即可

这个过程开个\(multiset\)可以较简单地做

复杂度\(O(nlog_n^2)\)(常数有点大)

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
using namespace std; inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (ch != '-' && (ch > '9' || ch < '0')) ch = getchar();
if (ch == '-') w = -1 , ch = getchar();
while (ch >= '0' && ch <= '9') data = data * 10 + (ch ^ 48), ch = getchar();
return w * data;
}
#define MAX_N 50005
struct Graph { int to, cost, next; } e[MAX_N << 1]; int fir[MAX_N], e_cnt = 0;
void clearGraph() { memset(fir, -1, sizeof(fir)); e_cnt = 0; }
void Add_Edge(int u, int v, int w) { e[e_cnt] = (Graph){v, w, fir[u]}; fir[u] = e_cnt++; }
int N, M, dp[MAX_N], stk[MAX_N], top;
multiset<int> s;
multiset<int> :: iterator ite;
int mid, cnt;
void dfs(int x, int f) {
for (int i = fir[x]; ~i; i = e[i].next)
if (e[i].to != f) dfs(e[i].to, x);
top = 0;
for (int i = fir[x]; ~i; i = e[i].next) {
int v = e[i].to;
if (v == f) continue;
dp[v] += e[i].cost;
if (dp[v] >= mid) ++cnt; else stk[++top] = dp[v];
}
sort(&stk[1], &stk[top + 1]); s.clear();
for (int i = 1; i <= top; i++) {
ite = s.lower_bound(mid - stk[i]);
if (ite != s.end()) s.erase(ite), ++cnt;
else s.insert(stk[i]);
}
dp[x] = s.size() ? *s.rbegin() : 0;
}
int main () {
clearGraph();
N = gi(), M = gi();
int l = 0, r = 0;
for (int i = 1; i < N; i++) {
int u = gi(), v = gi(), w = gi(); r += w;
Add_Edge(u, v, w), Add_Edge(v, u, w);
}
int ans = (r = r / M);
while (l <= r) {
mid = (l + r) >> 1, cnt = 0;
dfs(1, 0);
if (cnt >= M) ans = mid, l = mid + 1;
else r = mid - 1;
}
printf("%d\n", ans);
return 0;
}

【LG5021】[NOIP2018]赛道修建的更多相关文章

  1. Luogu5021 [NOIP2018]赛道修建

    Luogu5021 [NOIP2018]赛道修建 一棵大小为 \(n\) 的树,边带权.选 \(m\) 条链使得长度和最小的链最大. \(m<n\leq5\times10^4\) 贪心,二分答案 ...

  2. 竞赛题解 - NOIP2018 赛道修建

    \(\mathcal {NOIP2018}\) 赛道修建 - 竞赛题解 额--考试的时候大概猜到正解,但是时间不够了,不敢写,就写了骗分QwQ 现在把坑填好了~ 题目 (Copy from 洛谷) 题 ...

  3. [NOIP2018]赛道修建(二分+multiset)

    考场上打了一个 \(vector\) 解法,因为我当时不会 \(multiset\) 好吧,我来讲一讲今年的 \(tgD1T3\) 首先,这题 \(55\) 分是不难想的 1. \(b_i=a_i+1 ...

  4. 【比赛】NOIP2018 赛道修建

    最小值最大,二分长度 然后判断赛道大于等于这个长度最多可以有多少条 可以贪心,对于一个点和它的一些儿子,儿子与儿子之间尽量多配(排序后一大一小),剩下的选个最长的留给自己的父亲就好了 具体实现可以用一 ...

  5. [NOIP2018]赛道修建

    嘟嘟嘟 因为一些知道的人所知道的,不知道的人所不知道的原因,我来改写今年的NOIP了. 现在看这题,心中满是疑问:我当时是多么的zz,这种水题为啥没做出来-- 不管了,说正事. 先考虑部分分. 1.\ ...

  6. luogu5021 [NOIp2018]赛道修建 (二分答案+dp(贪心?))

    首先二分一下答案,就变成了找长度>=m的 不相交的路径的个数 考虑到在一个子树中,只有一个点能出这个子树去和别的点搞 所以我这个子树里尽量自我满足是不会有坏处的 而且要在自我满足数最大的条件下, ...

  7. 【题解】NOIP2018 赛道修建

    题目戳我 \(\text{Solution:}\) 根据题目信息简化题意,是让你在树上找出\(m\)条路径使得路径长度最小值最大. 看到题第一感先二分一个答案,问题转化为如何选择一些路径使得它们最小值 ...

  8. [NOIp2018提高组]赛道修建

    [NOIp2018提高组]赛道修建 题目大意: 给你一棵\(n(n\le5\times10^4)\)个结点的树,从中找出\(m\)个没有公共边的路径,使得第\(m\)长的路径最长.问第\(m\)长的路 ...

  9. noip2018 D1T3 赛道修建

    题目描述 C 城将要举办一系列的赛车比赛.在比赛前,需要在城内修建 mm 条赛道. C 城一共有 nn 个路口,这些路口编号为 1,2,…,n1,2,…,n,有 n-1n−1 条适合于修建赛道的双向通 ...

随机推荐

  1. 关于Struts2通配符无效的说明

    在struts2.3之前的版本,正常的配置就可以了,但在struts2.3版本之后,使用通配符调用方法时,内部会验证是否允许访问该方法. 1.struts2.5 为了增加安全性,在 struts.xm ...

  2. Functional Reactive Programming

    Functional Reactive Programming (FRP) integrates time flow and compositional events into functional ...

  3. Ubuntu 14.04 系统安装后无法上网的问题(eth0识别不出)

    Ubuntu 14.04 1.网口处网线状态等正常跳动 2.ifconfig 指令查询不到网卡信息 说明缺少了网卡驱动. 使用 lspci 指令查看系统中所有的驱动信息,找到 Ethernet Con ...

  4. [LuoguP1034][Noip2002] 矩形覆盖

    [LuoguP1034][Noip2002] 矩形覆盖(Link) 在平面上有\(N\)个点,\(N\)不超过五十, 要求将这\(N\)个点用\(K\)个矩形覆盖,\(k\)不超过\(4\),要求最小 ...

  5. CocoaPods安装指定版本

    Cocoapods目前最新的正式版本是0.35.0,如果升级到这个版本,并且在project中使用XMPPFramework,在pod install之后会出现如下循环依赖的问题 There is a ...

  6. js实现限制上传文件大小

    <html> <head> <script type="text/javascript"> var isIE = /msie/i.test(na ...

  7. POJ 1182 食物链(经典带权并查集 向量思维模式 很重要)

    传送门: http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: ...

  8. EF Core 中多次从数据库查询实体数据,DbContext跟踪实体的情况

    使用EF Core时,如果多次从数据库中查询一个表的同一行数据,DbContext中跟踪(track)的实体到底有几个呢?我们下面就分情况讨论下. 数据库 首先我们的数据库中有一个Person表,其建 ...

  9. Linux Shell常用技巧(十)

    二十. 通过管道组合Shell命令获取系统运行数据:  1.  输出当前系统中占用内存最多的5条命令:    #1) 通过ps命令列出当前主机正在运行的所有进程.    #2) 按照第五个字段基于数值 ...

  10. hiveSql常见错误记录

    1. In strict mode, if ORDER BY is specified, LIMIT must also be specified. 这个错误提示是因为在hive下写的sql使用了or ...