2023河南萌新联赛第(二)场:河南工业大学 F - 最短距离

这篇具有很好参考价值的文章主要介绍了2023河南萌新联赛第(二)场:河南工业大学 F - 最短距离。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2023河南萌新联赛第(二)场:河南工业大学 F - 最短距离

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

给定一棵包含 n n n 个顶点的树 T T T ,以及 m m m 个查询请求。每个查询包含三个参数 : x 、 y :x、y :xy k k k。其中 x x x y y y 是树中的两个顶点, k k k 是一个整数。对于每个查询,你需要计算树中所有顶点到从 x x x y y y 的简单路径上的最近距离恰好为 k k k 的顶点数量。

输入描述:

第一行,两个正整数n和m。 ( 1 ≤ n , m ≤ 1 e 5 ) (1≤n,m≤1e5) 1n,m1e5
接下来 n − 1 n-1 n1 行,每行两个正整数 x , y x,y x,y 。点 x x x 和点 y y y 之间有一条边。 ( 1 ≤ x , y ≤ n ) (1≤x,y≤n) 1x,yn)
最后 m m m 行,每行三个正整数 x , y , k x,y,k xyk ( 1 ≤ x , y ≤ n , 1 ≤ k ≤ 100 ) (1≤x,y≤n,1≤k≤100) 1x,yn1k100

输出描述:

对于每次询问,输出一个整数作为答案
每个答案占一行

示例1
输入
7 2
1 2
1 3
2 4
2 5
4 6
4 7
5 7 1
5 7 2
输出
2
1

由于 k k k 较小,我们可以先用一个简单的树形 DP 预处理出每个节点的子树中距离该节点距离为 0 − k 0-k 0k 的节点数量,
记为 d p [ n ] [ k ] dp[n][k] dp[n][k]
然后再进行一次换根 DP,计算每个节点的非子树节点距离该节点的距离为 0 − k 0-k 0k 的节点数量。同时分别给子树中
距离该节点的距离为 0 − k 0-k 0k d p dp dp 数组做一个根节点到该位置路径上的前缀和。
对于每个查询 :

  1. 先计算 x x x y y y的最近公共祖先 LCA。
  2. 在以 LCA 为根的子树中,到达 x − y x-y xy 简单路径距离为 d d d 的节点数量
    pre[x][k] + pre[y][k] - 2 * pre[w][k] + dp[w][k]) - (pre[x][k - 1] + pre[y][k - 1] - 2 * pre[w][k - 1]) + f[w][k]
    (通过前缀和计算,在以一个节点为根的子树中,到该节点距离为 d − 1 d-1 d1 的节点到其父节点的距离为 d d d ,但是这些节点并不符合题意,故减去)。
  3. 再加上距离 LCA 为 的非子树节点数量。
  4. 总的结果就是上面两项相加。

总的时间复杂度:
预处理树形 DP 和换根 DP 均为 O ( n k ) O(nk) O(nk)
查询时,计算最近公共祖先为 O ( l o g n ) O(logn) O(logn) ,计算结果为 O ( 1 ) O(1) O(1)
共有 q q q 次查询。
故总的时间复杂度为 O ( n × k + q × l o g n ) O(n×k+q×logn) O(n×k+q×logn)文章来源地址https://www.toymoban.com/news/detail-615097.html

import java.io.*;
import java.util.ArrayList;

public class Main {
    static int N = 100010;
    static ArrayList<Integer>[] e = new ArrayList[N];
    static int[][] dp = new int[N][110];
    static int[][] f = new int[N][110];
    static long[][] pre = new long[N][110];
    static int[] dep = new int[N];
    static int[][] fa = new int[N][21];

    public static void dfs_1(int u, int fr) {
        dp[u][0] = 1;
        dep[u] = dep[fr] + 1;
        fa[u][0] = fr;
        for (int i = 1; i <= 20; i++) {
            fa[u][i] = fa[fa[u][i - 1]][i - 1];
        }
        for (int j : e[u]) {
            if (j == fr) continue;
            dfs_1(j, u);
            for (int i = 1; i <= 100; i++)
                dp[u][i] += dp[j][i - 1];
        }
    }

    public static void dfs_2(int u, int fr) {
        for (int j : e[u]) {
            if (j == fr) continue;
            for (int i = 1; i <= 100; i++) {
                f[j][i] = dp[u][i - 1] + f[u][i - 1];
                if (i >= 2) f[j][i] -= dp[j][i - 2];
            }
            dfs_2(j, u);
        }
    }

    public static void dfs_3(int u, int fr) {
        for (int i = 0; i <= 100; i++) {
            pre[u][i] = dp[u][i] + pre[fr][i];
        }
        for (int j : e[u]) {
            if (j == fr) continue;
            dfs_3(j, u);
        }
    }

    public static int LCA(int u, int v) {
        if (dep[u] < dep[v]) {
            int t = u;
            u = v;
            v = t;
        }
        int k = dep[u] - dep[v];
        for (int i = 0; i <= 20; i++) {
            if ((k & (1 << i)) != 0) {
                u = fa[u][i];
            }
        }
        if (u == v) return u;
        for (int i = 20; i >= 0; i--) {
            if (fa[u][i] != fa[v][i]) {
                u = fa[u][i];
                v = fa[v][i];
            }
        }
        return fa[u][0];
    }

    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String[] str = bf.readLine().split(" ");
        int n = Integer.parseInt(str[0]);
        int m = Integer.parseInt(str[1]);
        for (int i = 0; i <= n; i++) {
            e[i] = new ArrayList<>();
        }
        for (int i = 1; i <= n - 1; i++) {
            str = bf.readLine().split(" ");
            int x = Integer.parseInt(str[0]);
            int y = Integer.parseInt(str[1]);
            e[x].add(y);
            e[y].add(x);
        }
        dfs_1(1, 0);
        dfs_2(1, 0);
        dfs_3(1, 0);
        while (m-- > 0) {
            str = bf.readLine().split(" ");
            int x = Integer.parseInt(str[0]);
            int y = Integer.parseInt(str[1]);
            int k = Integer.parseInt(str[2]);
            int w = LCA(x, y);
            bw.write((pre[x][k] + pre[y][k] - 2 * pre[w][k] + dp[w][k]) - (pre[x][k - 1] + pre[y][k - 1] - 2 * pre[w][k - 1]) + f[w][k] + "\n");
        }
        bw.close();
    }
}

到了这里,关于2023河南萌新联赛第(二)场:河南工业大学 F - 最短距离的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • F-小富的idea(2023河南萌新联赛第(四)场:河南大学)

    卷王小富最近又在内卷,并且学了一门新的技能:书法,但是不幸的是在国庆节的书法大赛上,小富不小心打翻了墨水瓶,导致很多墨滴溅在了他的书法纸上,看着墨水不断扩散,浸透了他的书法纸,小富突然萌生了一个想法:我能不能知道某时刻纸上一共有多少墨块?  我

    2024年02月13日
    浏览(28)
  • 2023河南萌新联赛第(四)场:河南大学 F - 小富的idea

    时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 要注意节约 卷王小富最近又在内卷,并且学了一门新的技能:书法,但是不幸的是在国庆节的书法大赛上,小富不小心打翻了墨水瓶,导致很多墨滴溅在了他的书法纸上,看着墨水不断

    2024年02月13日
    浏览(36)
  • L---泰拉瑞亚---2023河南萌新联赛第(三)场:郑州大学

    链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网   示例1 只有一把回旋镖,你可以先打两次伤害为3的,再打一次倾尽全力的,造成的伤害为5。总伤害为3+3+5=11,即可获得胜利。 示例2 你可以先把第一把倾尽全力打出去,造成30伤害。接下来用第二把连续攻击50次,

    2024年02月15日
    浏览(50)
  • “卓见杯”郑州轻工业大学第十五届程序设计大赛暨河南省高校邀请赛题解

    C 最大的数 — 贪心 首先n个点有n条边必然有环,因此可以无限制的加数,又因为题目要求最大不超过1e9,所以答案一定是9位数 如果把形成的环缩点的话就会变成拓扑序列,首先要找到数字最大的那几个点,把他们入队,然后遍历他们的下一个点,找到下一个点里的最大值,

    2023年04月13日
    浏览(54)
  • 郑州轻工业大学2022-2023(2)数据结构题目集

    目录 6-1 线性表元素的区间删除                                   6-2 有序表的插入 6-3 合并两个有序数组                                          6-4 顺序表操作集 6-5 递增的整数序列链表的插入                            6

    2024年02月10日
    浏览(36)
  • LitCTF2023 郑州轻工业大学首届网络安全赛 WP 部分

    由于刚接触CTF没多久 还是属于萌新级别的(中专高中生)也没怎么打过比赛记录一下学习的过程大佬绕过即可,后续会继续加油努力。 NSSCTF平台:https://www.nssctf.cn/ PS:记得所有的 flag 都改为 NSSCTF或者LitCTF 我Flag呢? 奇怪,放哪里了,怎么看不见呢?(初级难度) 直接 F12

    2024年02月05日
    浏览(39)
  • 齐鲁工业大学872数据结构考研笔记

    笔者水平有限,错误之处请指出。 官网考纲https://yjszs.qlu.edu.cn/_upload/article/files/d6/51/76dd4bc8494eb8dbf1327a9fdeaa/3d1521b3-ce94-4de3-adc6-56a2f87aa7ef.pdf 1.  数据 :是客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。 2. 数据元素 :是数据的基本单位,通常

    2024年02月15日
    浏览(30)
  • 合肥工业大学计算机网络实验一

    计算机网络实验报告# ✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :hfut实验报告 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永远是个观众。平台再好,你不参与,永远是局外人。能力再大,你不行动,只能看别人成功!

    2024年02月03日
    浏览(41)
  • 合肥工业大学2022大数据技术实验二

    实验序号及名称:实验 二   在 Hadoop平台上部署WordCount程序          实验时间∶ 2022 年 5 月 14 日   预习内容 一、实验目的和要求∶ 在Hadoop平台上部署WordCount程序。 二、实验任务∶ 该项任务请同学作为作业自行完成,并提交实验报告。 脱离ide环境运行wordcount 三、实验

    2024年02月04日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包