首页 > 编程语言 >第十四届蓝桥杯省赛 C++B组 ---- 景区导游

第十四届蓝桥杯省赛 C++B组 ---- 景区导游

时间:2023-11-17 19:55:31浏览次数:67  
标签:---- int faDis C++ 蓝桥 fa depth static new

第十四届蓝桥杯省赛 C++B组 ---- 景区导游

LCA

原题连接



​ lca 同时得到按原来路径走的总时间

​ 最后输出时处理跳过某个点的时间

​ 预处理用 bfs 或 dfs 都可以

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

/**
 * ClassName:Main
 * Package:lqb
 * Description:
 *
 * @author:LH寒酥
 * @create:2023/11/17-16:54
 * @version:v1.0
 */
public class Main {
    static final int N = 100010, M = N * 2, INF = 0x3f3f3f3f;
    static int n, idx;
    static int[] h = new int[N], ne = new int[M], e = new int[M], w = new int[M];
    static int[][] fa = new int[N][18];
    static long[][] faDis = new long[N][18];
    static int[] depth = new int[N], a = new int[N];

    static void add(int a,int b, int c) {
        e[idx] = b; w[idx] = c; ne[idx] = h[a]; h[a] = idx ++;
    }

    static void bfs(int root) {
        Arrays.fill(depth, INF);
        depth[0] = 0;
        depth[root] = 1;
        fa[root][0] = 0;
        faDis[root][0] = 0;
        Queue<Integer> queue = new LinkedList<>();
        queue.add(root);

        while (!queue.isEmpty()) {
            int t = queue.poll();
            for (int i = h[t]; i != -1; i = ne[i]) {
                int j = e[i]; int c = w[i];
                if (depth[j] > depth[t] + 1) {
                    depth[j] = depth[t] + 1;
                    queue.add(j);
                    fa[j][0] = t;
                    faDis[j][0] = c;
                    for (int k = 1; k <= 17; k ++) {
                        faDis[j][k] = faDis[fa[j][k - 1]][k - 1] + faDis[j][k - 1];
                        fa[j][k] = fa[fa[j][k- 1]][k - 1];
                    }
                }
            }
        }
    }

    static void dfs(int x, int father, long dis, int hh) {
        depth[x] = hh;
        faDis[x][0] = dis;
        fa[x][0] = father;

        for (int i = 1; i <= 17; i ++) {
            faDis[x][i] = faDis[x][i - 1] + faDis[fa[x][i - 1]][i - 1]; 
            fa[x][i] = fa[fa[x][i - 1]][i - 1];
        }

        for (int i = h[x]; i != -1; i = ne[i]) {
            int j = e[i];
            if (j == father) continue;
            dfs(j, x, w[i], hh + 1);
        }
    }

    static long lca(int a, int b) {
        long ans = 0;
        if (depth[a] < depth[b]) {
            int t = a;
            a = b;
            b = t;
        }
        for (int i = 17; i >= 0; i --) {
            if (depth[fa[a][i]] >= depth[b]) {
                ans += faDis[a][i]; // 先写
                a = fa[a][i];
            }
        }

        if (a == b) return ans;

        for (int i = 17; i >= 0; i --) {
            if (fa[a][i] != fa[b][i]) {
                ans += faDis[a][i] + faDis[b][i]; // 先写这个, 然后再更新
                a = fa[a][i];
                b = fa[b][i];
            }
        }
        ans += faDis[a][0] + faDis[b][0];
        return ans;
    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] s = br.readLine().split(" ");
        n = Integer.parseInt(s[0]);
        int k = Integer.parseInt(s[1]);

        Arrays.fill(h, -1);

        for (int i = 0; i < n - 1; i ++) {
            s = br.readLine().split(" ");
            int a = Integer.parseInt(s[0]);
            int b = Integer.parseInt(s[1]);
            int w = Integer.parseInt(s[2]);
            add(a, b, w); add(b, a, w);
        }

//        bfs(1);
        dfs(1, 0, 0, 1);

        long res = 0;
        s = br.readLine().split(" ");
        for (int i = 1; i <= k; i ++) {
            a[i] = Integer.parseInt(s[i - 1]);
            if (i > 1) res += lca(a[i], a[i - 1]);
//            System.out.println(a[i] + " " + res);
        }

        for (int i = 1; i <= k; i ++) {
            if (i == 1) System.out.print(res - lca(a[1], a[2]) + " ");
            else if (i == k) System.out.print(res - lca(a[k], a[k - 1]) + " ");
            else System.out.print(res - lca(a[i], a[i - 1]) - lca(a[i], a[i + 1]) + lca(a[i - 1], a[i + 1]) + " ");
        }
    }
}

刚学LCA, 先留在这

标签:----,int,faDis,C++,蓝桥,fa,depth,static,new
From: https://www.cnblogs.com/rimliuhan/p/17839540.html

相关文章

  • OI回忆录+退役记
    2023年11月17日明天就是NOIP了,打算打完NOIP就退役,于是在这里写一篇回忆录。我初中的时候根本不知道有信息竞赛这个东西,甚至对其它的竞赛也不了解,唯一的印象只是竞赛题很难,参加竞赛的人很强,仅此而已。那时候高一军训之后因为疫情就开始上网课,也是在上课后的没几天,我的班主任在班......
  • vscode配置js片段及格式处理
    1、前期工作需要将代码块处理成要求的格式,即变量用$开头标记,每一个tab缩进用\t替换,代码中的双引号用转义字符\"替换,每一行放双引号中,行末加逗号。。。具体操作及截图如下:(1)、代码中的变量用“$1”,“$2”,“$3”....等替换(2)、在文本编辑器或者vscode中将缩进用\t替换(3)、将代......
  • session源码,闪现,请求扩展
    1session源码......
  • P1098 [NOIP2007 提高组] 字符串的展开(总结)
    P1098[NOIP2007提高组]字符串的展开http://ww.luogu.com.cn/problem/P1098注意字符中的数字是默认小于字母的。所以要对数字做特判。#include<iostream>#include<string>usingnamespacestd;intmain(){ intp1,p2,p3; cin>>p1>>p2>>p3; strings; cin......
  • vscode插件:koroFileHeader(添加注释文件头)
    第一步:安装插件koroFileHeader。如下图1 第二步:配置setting。将下面的json代码配置到setting中。"fileheader.configObj":{"createFileTime":true,"language":{"languagetest":{"head":"/$$",......
  • CSMA,CSMA/CD,CSMA/CA
    1.CDMA 先对CSMA进行总结,非坚持,1坚持,p-坚持。  2.CSMA/CD 这好像是2020年912考试的题目。  3.CSMA/CA ......
  • 每日总结20231117
    代码时间(包括上课)3h代码量(行):100行博客数量(篇):1篇相关事项:1、今天是周五,今天的期中测试延迟了,今天主要的是把人机交互技术的b/s架构的报告写完了,而且同时写了一篇思想汇报,思想汇报终于写完了,目前他可以告一段落了。2、今天下午洗了洗澡,洗了洗衣服,也收获满满。3、今天晚上打算......
  • 2.4 变量的输入
    谓输入,就是用代码获取用户通过键盘输入的信息例如:去银行取钱,在ATM上输入密码在Python中,如果要获取用户在键盘上的输入信息,需要使用到input函数1)关于函数一个提前准备好的功能(别人或者自己写的代码),可以直接使用,而不用关心内部的细节目前已经学习过的函数函数说明......
  • C++ 指针学习笔记
    C++指针学习笔记引入指针是什么指针是一个变量,其值为另一个变量的地址。指针声明的一般形式为:type*ptr_name;type是指针的基类型,ptr_name是指针的名称,*用来指定一个变量是指针对于一个指针,需要明确四个方面的内容:指针的类型、指针所指向的类型、指针的值(指针所指向的......
  • Windows rustup update 速度慢,使用字节跳动Rust镜像加速
    不设置镜像加速rustup更新升级会非常慢RsProxy字节跳动的Rust镜像 Windows想要使用这个镜像需要按照官方提示去设置两个系统变量分别为 RUSTUP_DIST_SERVER RUSTUP_UPDATE_ROOT 之后来到当前用户文件夹下修改cargo的配置文件(没有就创建一个)C:\Users\你PC名\.c......