首页 > 其他分享 >IOI 2011 Race

IOI 2011 Race

时间:2024-11-06 22:20:34浏览次数:1  
标签:leq int 样例 dep Race IOI 2011 mx dis

[IOI2011] Race

题目描述

给一棵树,每条边有权。求一条简单路径,权值和等于 \(k\),且边的数量最小。

输入格式

第一行包含两个整数 \(n,k\),表示树的大小与要求找到的路径的边权和。

接下来 \(n-1\) 行,每行三个整数 \(u_i,v_i,w_i\),代表有一条连接 \(u_i\) 与 \(v_i\),边权为 \(w_i\) 的无向边。

注意:点从 \(0\) 开始编号

输出格式

输出一个整数,表示最小边数量。

如果不存在这样的路径,输出 \(-1\)。

样例 #1

样例输入 #1

4 3
0 1 1
1 2 2
1 3 4

样例输出 #1

2

提示

对于 \(100\%\) 的数据,保证 \(1\leq n\leq 2\times10^5\),\(0\leq k,w_i\leq 10^6\),\(0\leq u_i,v_i<n\)。

solution

对于每个分治点x,遍历到的每个儿子y,将所有在y之前的儿子加入一个桶中,桶的下标存距离,桶的值存dep,而路径(u,v)经过的边数就是dep[u]+dep[v]-2*dep[x](这里dep[x]设为0了,所以代码里没有)

但是dis的分布可能很离散,所以还要用一个数组A来记录当前桶内出现过的dis,便于删桶

然后这题就愉快的做完了

Code:


#include<bits/stdc++.h>
const int N=2e5+5;
const int inf=1e6+5;
using namespace std;
struct Node{
    int x,y;
};
int n,k,e_cnt,tot,cent,ans,ddd;
int nxt[N<<1],to[N<<1],w[N<<1],head[N],vis[N];
int dis[N],siz[N],mx[N],dep[N];
void add(int x,int y,int z)
{

    to[++e_cnt]=y;nxt[e_cnt]=head[x];w[e_cnt]=z;
    head[x]=e_cnt;
}
void get_cent(int u,int fa)
{
    siz[u]=1;
    mx[u]=0;
    for(int i=head[u];i;i=nxt[i])
    {
        int v=to[i];
        if(fa==v||vis[v])continue;
        get_cent(v,u);
        siz[u]+=siz[v];
        mx[u] = (siz[v] > mx[u] ? siz[v] : mx[u]);
    }
    mx[u] = (mx[u] > tot-siz[u] ? mx[u] : tot-siz[u]);
    cent = (mx[cent] <mx[u] ? cent : u);
}
int ba[inf],A[N];
inline int Min(int x,int y)
{
    return (x<y ? x : y);
}
vector<Node>Q;
void get_dis(int u,int fa)
{
    Q.push_back(Node{dis[u],dep[u]});
    for(int i=head[u];i;i=nxt[i])
    {
        int v=to[i];
        if(vis[v]||v==fa)continue;
        dis[v]=dis[u]+w[i];
        dep[v]=dep[u]+1;
        get_dis(v,u);
    }
}
void INIT()
{
    ans=inf;
    for(int i=0;i<=k;i++)ba[i]=inf;
}
void calc(int x)
{
    dis[x]=0;
    dep[x]=0;
    ba[0]=0;
    A[++A[0]]=0;
    for(int i=head[x];i;i=nxt[i])
    {
        int v=to[i];
        if(vis[v])continue;
        dep[v]=1;dis[v]=w[i];
        get_dis(v,x);
        for(auto To : Q)
        {
            int tmp = k - To.x;
            if(0<=tmp&&tmp<=k)
            ans=Min(ans,ba[tmp]+To.y);
        }
        for(auto To : Q)
        {
            if(To.x>k)continue;
            if(ba[To.x]==inf)A[++A[0]]=To.x;
            ba[To.x]=Min(ba[To.x],To.y);
        }
        Q.clear();
    }
    for(int i=0;i<=A[0];i++)
    {
        ba[A[i]]=inf;
    }
    A[0]=0;
}
void solve(int x)
{
    calc(x);
    vis[x]=1;
    for(int i=head[x],y;i;i=nxt[i])
    {
        y=to[i];
        if(vis[y])continue;
        mx[cent=0]=inf;tot=siz[y];
        get_cent(y,x);
        solve(cent);
    }
}
void work()
{
    cin>>n>>k;
    INIT();
    for(int i=1,x,y,z;i<n;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        x++,y++;
        add(x,y,z);
        add(y,x,z);
    }
    mx[cent=0]=inf;tot=n;
    get_cent(1,0);
    solve(cent);
    ans = (ans==inf ? -1 : ans);
    printf("%d",ans);
}
int main()
{
    //freopen("P4149_1.in","r",stdin);
    //("Race.out","w",stdout);
    work();
    return 0;
}

标签:leq,int,样例,dep,Race,IOI,2011,mx,dis
From: https://www.cnblogs.com/LG017/p/18531171

相关文章

  • 毕业设计-课程设计-Cisco paket tracert校园网网络设计
    文章目录1.前言2.详细设计3.文档参考绪论3.1课题背景3.2校园网建设的目的和意义3.3系统设计思想3.4本章小结4.获取源码1.前言......
  • GB/T 28046.3-2011 道路车辆 电气及电子设备的环境条件和试验 第3部分:机械负荷(10)
    写在前面本系列文章主要讲解道路车辆电气及电子设备的环境条件和试验GB/T28046标准的相关知识,希望能帮助更多的同学认识和了解GB/T28046标准。若有相关问题,欢迎评论沟通,共同进步。(*^▽^*)第3部分:机械负荷附录A振动试验曲线建立指南(资料性附录)A.5疲劳计算A.5.6通过......
  • GB/T 28046.3-2011 道路车辆 电气及电子设备的环境条件和试验 第3部分:机械负荷(5)
    写在前面本系列文章主要讲解道路车辆电气及电子设备的环境条件和试验GB/T28046标准的相关知识,希望能帮助更多的同学认识和了解GB/T28046标准。若有相关问题,欢迎评论沟通,共同进步。(*^▽^*)第3部分:机械负荷4.1振动4.1.2试验4.1.2.8试验VIII——商用车分体式驾驶室4......
  • P4149 [IOI2011] Race——点分治 模板
    [IOI2011]Race题目描述给一棵树,每条边有权。求一条简单路径,权值和等于\(k\),且边的数量最小。输入格式第一行包含两个整数\(n,k\),表示树的大小与要求找到的路径的边权和。接下来\(n-1\)行,每行三个整数\(u_i,v_i,w_i\),代表有一条连接\(u_i\)与\(v_i\),边权为\(w_i\)......
  • GB/T 28046.3-2011 道路车辆 电气及电子设备的环境条件和试验 第3部分:机械负荷(3)
    写在前面本系列文章主要讲解道路车辆电气及电子设备的环境条件和试验GB/T28046标准的相关知识,希望能帮助更多的同学认识和了解GB/T28046标准。若有相关问题,欢迎评论沟通,共同进步。(*^▽^*)第3部分:机械负荷4.1振动4.1.2试验4.1.2.3试验III——乘用车柔性气室4.1.2.......
  • 【软考】系统架构设计师-2011年下半年上午综合知识真题及答案
    全国计算机技术与软件专业技术资格(水平)考试高级系统架构设计师2011年下半年上午试卷 综合知识试题一 操作系统为用户提供了两类接口:操作一级和程序控制一级的接口,以下不属于操作一级的接口是( )。A.操作控制命令  B.系统调用  C.菜单 D.窗口试题二 (第......
  • P4898 [IOI2018] seats 排座位
    题目链接主要算法:线段树(虚假的),奇技淫巧(真正的)思路:1.初步:考虑如何保证一个区间坐好后是一个矩形,有一个思路从另一个题中启示我们维护\(xmin,xmax,ymin,ymax\),但是这样无法保证在中间挖一个空的情况(有一个别的题解,可以染色后维护四个角和一个判框的东西),但我们觉得就算可以维......
  • [IOI2008] Island
    算法题意可以转化成给定一个基环树森林,求每颗基环树上的直径长度之和找环按照基环树的方法找即可求直径(i)直径不经过环对于以环上每一个点的子树,记录直径即可(ii)直径经过环断环为链,考虑单调队列处理,具体的关于为什么需要断环为链:方便快速处理环上两点间......
  • 题解 洛谷 Luogu P1308 [NOIP2011 普及组] 统计单词数 C++
    题目传送门:P1308[NOIP2011普及组]统计单词数-洛谷|计算机科学教育新生态https://www.luogu.com.cn/problem/P1308getline() 会清除使当次getline() 终止的换行,而cin 不会因此cin 以换行终止,之后还需要getline()的话,需要用getchar() 吞换行Linux的一些相......
  • POI2011/洛谷P3523 DYN-Dynamite
    前言Link本来一个很直观的题面,非要搞形式化题意反而使题意变得非常迷惑。题意有一栋树形建筑,其中有一些点摆放了TNT,树边上都摆放了引信,引信的燃烧时间为\(1\)秒\(/\)边,现在你要选择\(m\)个点同时点燃引信(起爆),则显然TNT被引爆的时间为到离它最近的起爆处的距离,请你求......