Educational Codeforces Round 162 (Rated for Div. 2) ----- E. Count Paths --- 题解

news2025/1/19 22:22:33

E. Count Paths:

题目大意:

思路解析:

根据题目中定义的美丽路径,我们可以发现路径只有两种情况:

当前结点作为起始结点,那我们只需要知道它的子树下有多少个相同颜色的结点,并且相同颜色的结点会被祖先结点阻挡,那我们只需要统计每个子树拥有x颜色的结点有多少个,记录时排除阻挡造成的影响,这样就可以完成对当前结点作为起始结点的答案统计

当前结点中间结点,那么答案只可能出现他的两个子树之间,我们发现上一步我们需要求所以子树当前结点的颜色共有多少个结点,即发现我们需要对这个子树的颜色统计进行合并,并且在合并过程中对此情况下答案进行统计。

这样就可以把这两种情况的答案统计完毕,

 

代码实现:



import java.io.*;
import java.math.BigInteger;
import java.util.*;


public class Main {
    static long inf = (long) 2e18;

    public static void main(String[] args) throws IOException {
        int t = f.nextInt();
        while (t > 0) {
            solve();
            t--;
        }

        w.flush();
        w.close();
        br.close();
    }

    static long ans = 0;
    static Vector<Integer>[] g;
    static int[] c;
    static HashMap<Integer, Integer>[] cnt;

    public static void solve() {
        ans = 0;
        int n = f.nextInt();
        g = new Vector[n];
        cnt = new HashMap[n];
        for (int i = 0; i < n; i++) {
            g[i] = new Vector<>();
            cnt[i] = new HashMap<>();
        }
        c = new int[n];
        for (int i = 0; i < n; i++) {
            c[i] = f.nextInt();
        }
        for (int i = 0; i < n - 1; i++) {
            int x = f.nextInt() - 1; int y = f.nextInt() - 1;
            g[x].add(y); g[y].add(x);
        }
        dfs(0, -1);
        w.println(ans);
    }

    public static void dfs(int x, int fa){
        int bst = -1;
        for (int i = 0; i < g[x].size(); i++) {
            int y = g[x].get(i);
            if (y == fa) continue;
            dfs(y, x);
            if (bst == -1 || cnt[bst].size() < cnt[y].size()) bst = y;
        }
        if (bst != -1) cnt[x] = cnt[bst];
        for (int i = 0; i < g[x].size(); i++){
            int y = g[x].get(i);
            if (y == fa) continue;
            if (bst == y) continue;
            for (Integer a : cnt[y].keySet()) {
                if (a != c[x]) ans += (long) cnt[x].getOrDefault(a, 0) * cnt[y].get(a);
                cnt[x].put(a, cnt[x].getOrDefault(a, 0) + cnt[y].get(a));
            }
        }
        ans += cnt[x].getOrDefault(c[x], 0);
        cnt[x].put(c[x], 1);

    }

    static PrintWriter w = new PrintWriter(new OutputStreamWriter(System.out));
    static Input f = new Input(System.in);
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    static class Input {
        public BufferedReader reader;
        public StringTokenizer tokenizer;

        public Input(InputStream stream) {
            reader = new BufferedReader(new InputStreamReader(stream), 32768);
            tokenizer = null;
        }

        public String next() {
            while (tokenizer == null || !tokenizer.hasMoreTokens()) {
                try {
                    tokenizer = new StringTokenizer(reader.readLine());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            return tokenizer.nextToken();
        }

        public String nextLine() {
            String str = null;
            try {
                str = reader.readLine();
            } catch (IOException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
            return str;
        }

        public int nextInt() {
            return Integer.parseInt(next());
        }

        public long nextLong() {
            return Long.parseLong(next());
        }

        public Double nextDouble() {
            return Double.parseDouble(next());
        }

        public BigInteger nextBigInteger() {
            return new BigInteger(next());
        }
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1571916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

攻防世界:mfw[WriteUP]

根据题目提示考虑是git库泄露 这里在地址栏后加.git也可以验证是git库泄露 使用GitHack工具对git库进行恢复重建 在templates目录下存在flag.php文件&#xff0c;但里面并没有flag 有内容的只有主目录下的index.php index.php源码&#xff1a; <?phpif (isset($_GET[page…

2024年最新版FL Studio21.2.3 Build 4004 for Mac 版激活下载和图文激活教程

FL studio21中文别名水果编曲软件&#xff0c;是一款全能的音乐制作软件&#xff0c;包括编曲、录音、剪辑和混音等诸多功能&#xff0c;让你的电脑编程一个全能的录音室&#xff0c;它为您提供了一个集成的开发环境&#xff0c;使用起来非常简单有效&#xff0c;您的工作会变得…

重读Java设计模式: 桥接模式详解

引言 在软件开发中&#xff0c;经常会遇到需要在抽象与实现之间建立连接的情况。当系统需要支持多个维度的变化时&#xff0c;使用传统的继承方式往往会导致类爆炸和耦合度增加的问题。为了解决这一问题&#xff0c;我们可以使用桥接模式。桥接模式是一种结构型设计模式&#…

机器学习中的GBDT模型及其优缺点(包含Python代码样例)

目录 一、简介 二、优缺点介绍 三、Python代码示例 四、总结 一、简介 GBDT&#xff08;Gradient Boosting Decision Tree&#xff09;是一种集成学习算法&#xff0c;被广泛应用于机器学习中的回归和分类问题。它由多个决策树组成&#xff0c;每个决策树都通过迭代逐渐提升…

巧用 STM32CubeIDE 之编译警告

1. 前言 编译警告对于工程师们来说&#xff0c;是再常见不过的了。对于严谨的工程师们来说&#xff0c;任何warning 都是不可忽视的。 2. 巧妙使用 warning 在 STM32CubeIDE 中&#xff0c;我们可以通过主动 warning&#xff08;甚至 error&#xff09;的方式来通知工程师&a…

计算机网络-TCP基础、三次挥手、四次握手过程

TCP基础 定义&#xff1a;TCP是面向连接的、可靠的、基于字节流的传输层通信协议。这意味着在发送数据之前&#xff0c;TCP需要建立连接&#xff0c;并且它能确保数据的可靠传输。此外&#xff0c;TCP将数据视为无结构的连续字节流。面向连接&#xff1a;TCP只能一对一进行连接…

ES6中数组新增的扩展和方法

文章目录 一、扩展运算符的应用二、构造函数新增的方法Array.from()Array.of()三、实例对象新增的方法copyWithin()find()、findIndex()fill()entries()&#xff0c;keys()&#xff0c;values()includes()flat()&#xff0c;flatMap()四、数组的空位五、sort排序稳定性 参考文献…

响应式网站设计哪个类型比较适合你?

响应式网站设计哪个类型比较适合你&#xff1f;有很多人对于响应式网站还不太了解&#xff0c;其实这种网站就是以创建页面的图片排版大小&#xff0c;来根据浏览网站用户所使用网络设备&#xff0c;自动化适应这些设备。 不管是出于网站兼容性还是用户信息需求&#xff0c;它都…

RK3568测试

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

深入浅出 -- 系统架构之微服务架构的新挑战

尽管微服务架构有着高度独立的软件模块、单一的业务职责、可灵活调整的技术栈等优势&#xff0c;但也不能忽略它所带来的弊端。本篇文章&#xff0c;我们从网络、性能、运维、组织架构和集成测试五个方面来聊一下设计微服务架构需要考虑哪些问题&#xff0c;对设计有哪些挑战呢…

使用 Apipost 管理项目接口文档

目录 前言 基本使用教程 注册账号 创建项目 创建接口 编辑接口 ​编辑 接口设计 生成文档 接口用例 前言 在 web 后端开发中&#xff0c;开发接口之前通常需要先写接口文档&#xff0c;然后前后端再根据接口文档开始开发系统模块。接口文档形式多种多样&#xff0c…

Aurora8b10b(1)IP核介绍并基于IP核进行设计

文章目录 前言一、IP核设置二、基于IP核进行设计2.1、设计框图2.2、aurora_8b10b_0模块2.3、aurora_8b10b_0_CLOCK_MODULE2.4、aurora_8b10b_0_SUPPORT_RESET_LOGIC2.5、aurora8b10b_channel模块2.6、IBUFDS_GTE2模块2.7、aurora_8b10b_0_gt_common_wrapper模块2.8、aurora8b10…

基于MPPT的风力机发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1风能与风力发电机模型 4.2风力机功率特性与最大功率点 4.3 MPPT 5.完整工程文件 1.课题概述 基于MPPT的风力机发电系统simulink建模与仿真。MPPT使用S函数编写实现。基于最大功率点跟踪&#xff08…

【OpenCV-颜色空间】

OpenCV-颜色空间 ■ RGB■ BGR■ HSV■ HSL■ HUE■ YUV ■ RGB ■ BGR BGR 就是RGB R和B调换位置。 OpenCV 默认使用BGR ■ HSV ■ HSL ■ HUE ■ YUV

免费搭建:雾锁王国Enshrouded游戏服务器,10秒完成!

免费自建雾锁王国Enshrouded服务器&#xff0c;先领取阿里云300元无门槛代金券&#xff0c;然后在雾锁王国Enshrouded专题页一键部署&#xff0c;不需要基础&#xff0c;鼠标点选即可10秒钟创建一台雾锁王国游戏服务器&#xff0c;超简单&#xff0c;阿里云服务器网aliyunfuwuq…

利用IP地址判断羊毛用户:IP数据云提供IP风险画像

在当今数字化社会&#xff0c;互联网已经成为人们日常生活和商业活动中不可或缺的一部分。然而&#xff0c;随着网络的普及&#xff0c;网络欺诈行为也日益猖獗&#xff0c;其中包括了羊毛党这一群体。羊毛党指的是利用各种手段获取利益、奖励或者优惠而频繁刷取优惠券、注册账…

leetcode热题100.跳跃游戏2

Problem: 45. 跳跃游戏 II 文章目录 题目思路复杂度Code 题目 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: …

【排列回溯】Leetcode 46. 全排列

【排列回溯】Leetcode 46. 全排列 ---------------&#x1f388;&#x1f388;题目链接&#x1f388;&#x1f388;------------------- used数组&#xff0c;其实就是记录此时temp 里都有哪些元素使用了&#xff0c;一个排列里一个元素只能使用一次。 class Solution {List&…

Dockerd的使用

端口映射 存储卷 类似于mount&#xff0c;把真机的某个目录映射都容器里面 -v 选项可以有多个 利用存储卷修改配置文件 容器间网络模式 共享网络为 --networkcontainer&#xff1a;容器名 微服务架构 一种由容器为载体&#xff0c;使用多个小型服务组合来构建复杂的架构为…

如何编写属于自己的第一个exp

0x00 前言 在我们找到一个漏洞之后&#xff0c;可能会想着去fofa上搜语法进而扩大战果&#xff0c;而有些漏洞利用起来十分繁琐&#xff0c;这时候就需要一个exp来批量帮我们进行扫描工作&#xff0c;接下来就介绍一下如何进行exp的编写&#xff0c;这个过程中最重要的还是体现…