首页 > 其他分享 >NOIP2018 赛道修建

NOIP2018 赛道修建

时间:2023-10-29 16:58:31浏览次数:44  
标签:赛道 set int res mid NOIP2018 修建 当前

观察题目不难想到二分答案。

考虑二分所有赛道的最小长度值,那么我们可以去判断最后修建出来的赛道数是不是大于等于 \(m\) 条即可。

用 \(f_{i}\) 表示当前以 \(i\) 为根,最长的未被赛道占用的链的长度。

但是有很多链,匹配的过程不好进行,所以改为用 multiset 来维护当前点的链有多少个没匹配的。

在处理完所有子树后,对 mltiset 内的元素分以下几种情况讨论:

  • 当前 set 内只有一个元素,直接退出,当前点最长未匹配的就是他。

  • 当前 set 内有多个,那么取最小值,然后看 set 里是否有元素和他加起来能到 mid,如果可以就 sum++,反之删除,然后更新最大未匹配的链长。

  • 有一个特殊情况就是当前单条链就大于等于 mid 了,可以直接不加进 set 里。

/*
 * @Author: Aisaka_Taiga
 * @Date: 2023-10-29 15:17:24
 * @LastEditTime: 2023-10-29 16:27:11
 * @LastEditors: Aisaka_Taiga
 * @FilePath: \Desktop\P5021.cpp
 * The heart is higher than the sky, and life is thinner than paper.
 */
#include <bits/stdc++.h>

#define int long long
#define N 50100

using namespace std;

inline int read()
{
    int x = 0, f = 1;
    char c = getchar();
    while(c < '0' || c > '9'){if(c == '0') f = -1; c = getchar();}
    while(c <= '9' && c >= '0') x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
    return x * f;
}

int n, m, head[N << 1], cnt, ans, sum, mid;
struct node{int u, v, w, next;}e[N << 1];
multiset<int> s[N];
multiset<int> :: iterator it;

inline void add(int u, int v, int w){e[++ cnt] = (node){u, v, w, head[u]}; head[u] = cnt;}

inline int dfs(int x, int fa)
{
    s[x].clear();//每次都清空一下
    for(int i = head[x]; i; i = e[i].next)
    {
        int v = e[i].v;
        if(v == fa) continue;
        int val = e[i].w + dfs(v, x);//当前子树通过这条道路能到x点的长度
        if(val >= mid) sum ++;//直接大于mid了就归成一条赛道,条数加1
        else s[x].insert(val);//否则就插入当前点的set里
    }
    int res = 0;//存放当前点能到达x点的最短的路径长度
    while(!s[x].empty())
    {
        if(s[x].size() == 1) return max(res, *s[x].begin());//只有一个就没有可以选的直接返回第一个
        int kk = *s[x].begin();//当前最小的元素的值
        s[x].erase(s[x].begin());//删除
        it = s[x].lower_bound(mid - kk);//找到当前子树里最小的差多少
        if(it == s[x].end()) res = max(res, kk);//找不到加起来能到mid的就更新没匹配的最大值
        else sum ++, s[x].erase(it);//能匹配上就赛道数+1,删除当前的长度
    }
    return res;
}

inline int check()
{
    sum = 0;//存放当前mid长度能分出来的赛道条数
    dfs(1, 0);
    return sum >= m;
}

signed main()
{
    n = read(), m = read();
    for(int i = 1; i <= n - 1; i ++)
    {
        int u = read(), v = read(), w = read();
        add(u, v, w), add(v, u, w);
    }
    int l = 1, r = 1e9;
    while(l < r)
    {
        mid = (l + r) >> 1;
        if(check()) l = mid + 1;
        else r = mid;
    }
    cout << l - 1 << endl;
    return 0;
}
/*
7 1 
1 2 10 
1 3 5 
2 4 9 
2 5 8 
3 6 6 
3 7 7
*/

标签:赛道,set,int,res,mid,NOIP2018,修建,当前
From: https://www.cnblogs.com/Multitree/p/17796028.html

相关文章

  • 2023年SWPU NSS 秋季招新赛 (校外赛道) MISC复盘WP
    GIFCode题目描述:扫一扫即可获取Flag给了一个含二维码的动图,分离一下得到九张二维码碎片,根据文件名数字按顺序组装,在线扫码即可NSSCTF{3f0ac91b-3e0e-a7e2-7b2a-c67cfdc093fe}相信他终将回来题目描述:我们的湾湾hint1:base怎么就不能转成16进制呢010查看,base64转图片但......
  • FSCTF 2023(公开赛道)WP
    FSCTF2023ID:Mar10Rank:6总结:下次看到不正常报错一定重新安装一遍工具~~web源码!启动!就在源码注释里<!--师傅们,欢迎来到CTF的世界~NSSCTF{59a1d387-6eb8-40d0-828d-99ce32b3feb8}--->webshell是啥捏哭脸是passthru,那直接命令执行Hello,you源码有注释......
  • FSCTF 2023(公开赛道)CRYPTO WP
    RSA11、题目信息提交格式:FSCTF{你所解出的内容}p=1458769258361q=4556983871563e=17求d2、解题方法expfromgmpy2import*p=1458769258361q=4556983871563e=17d=int(invert(e,(p-1)*(q-1)))print(d)#FSCTF{5865518808244394324786753}做不出来就别阴阳怪气......
  • NewStarCTF 2023 公开赛道 Week3
    官方WPhttps://shimo.im/docs/QPMRxzGktzsZnzhz/readNewStarCTF2023Week3官方WriteUp.htmlCryptoRabin'sRSA参考博客:RSA攻击之Rabin密码体制_rsarabin-CSDN博客使用轩禹一把梭了Misc阳光开朗大男孩社会主义核心价值观https://ctf.bugku.com/tool/cvecode解码得......
  • NewStarCTF 2023 公开赛道 WEEK2|CRYPTO全解
    一、滴啤题目信息fromCrypto.Util.numberimport*importgmpy2fromflagimportflagdefgen_prime(number):p=getPrime(number//2)q=getPrime(number//2)returnp,qm=bytes_to_long(flag.encode())p,q=gen_prime(1024)print(p*q)e=65537d......
  • NewStarCTF 2023 公开赛道 WEEK1|CRYPTO全解
    一、brainfuck附件信息++++++++[>>++>++++>++++++>++++++++>++++++++++>++++++++++++>++++++++++++++>++++++++++++++++>++++++++++++++++++>++++++++++++++++++++>++++++++++++++++++++++>++++++++++++++++++++++++>+++++++++++++++++......
  • 2023年SWPU NSS 秋季招新赛 (校外赛道)WP—Crypto
    一、Caesar_base题目信息s="HIJKLMNOPQRSTUVWXYZABCDEFGhijklmnopqrstuvwxyzabcdefg0123456789+/"#码表defMy_base64_encode(inputs): bin_str=[] foriininputs: x=str(bin(ord(i))).replace('0b','') bin_str.append('{......
  • NOIP2018PJ T3 摆渡车(2023.10第二版题解)
    题目链接 题意:时间轴上分布着$n$位乘客($1\len\le500$),$i$号乘客的位置为$t_i$(0\let_i\le4\times10^6),用互相距离不小于$m$的车次将时间轴分为若干部分,并管辖以自己为右端点的这个区间(除了第一趟车包括$0$,其他车次左开右闭),求最小费用和。每个车次的费用来自:管辖区间内所......
  • P5018 [NOIP2018 普及组] 对称二叉树
    先递归判断当前子树是不是对称二叉树,如果是就取\(\max\)然后退出,否则继续递归左儿子的左子树和右儿子的右子树、左儿子的右子树和右儿子的左子树判断。最坏情况是每次都递归到叶子,也就是每层都是\(O(n)\)。但一共只有\(O(\logn)\)层,所以时间复杂度是\(O(n\logn)\)。......
  • 【专题】2023年3月母婴赛道社媒电商报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=33866品牌一直在思考如何更好地了解消费者的需求,特别是在年轻化和线上消费趋势加强的母婴行业。根据《2023母婴行业数据报告合集》,短视频直播平台成为该行业新的增长点。报告合集显示,母婴商品的消费人数在2022年全年和2023年前两个月均呈快速增长趋......