树形dp + 位运算 + 差分,MC0362 异或

news2024/9/29 13:17:37

目录

一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

二、解题报告

1、思路分析

2、复杂度

3、代码详解


一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

码题集OJ-异或 (matiji.net)


二、解题报告

1、思路分析

考虑每个结点u,其子树内距离其在k内结点对其贡献

由于是异或,所以想到按位拆分考虑贡献

我们考虑dfs,由于dfs每次沿着一条路径来走,我们可以用栈保存当前正在走的路径

维护一个差分数组diff[u][i][0 / 1] 代表 结点 u 所在子树内有效结点 第i位为1的结点数目

遍历到每个结点对<stk[top - k - 2], u> 这个区间进行差分修改即可

然后再做一次dfs 计算差分数组的前缀和

2、复杂度

时间复杂度: O(NlogU)空间复杂度:O(NlogU)

3、代码详解

 ​
#include <bits/stdc++.h>
// #include <ranges>

using u32 = unsigned;
using i64 = long long;
using u64 = unsigned long long;

constexpr int P = 1'000'000'007;

void solve() {
    int n, q, k;
    std::cin >> n >> q >> k;

    std::vector<int> a(n);
    for (int i = 0; i < n; ++ i) std::cin >> a[i];

    std::vector<std::vector<int>> adj(n);
    
    for (int i = 0, u, v; i + 1 < n; ++ i) {
        std::cin >> u >> v;
        -- u, -- v;
        adj[u].push_back(v), adj[v].push_back(u);
    }

    std::vector<int> ans(n), st;
    std::vector<std::vector<std::array<int, 2>>> diff(n, std::vector<std::array<int, 2>>(30));

    auto dfs = [&](auto &&self, int u, int p) -> void {
        st.push_back(u);
        for (int i = 0; i < 30; ++ i)
            ++ diff[u][i][a[u] >> i & 1];

        if (st.size() > k + 1) 
            for (int i = 0; i < 30; ++ i)
                -- diff[st[st.size() - k - 2]][i][a[u] >> i & 1];

        for (int v : adj[u]) {
            if (v == p) continue;
            self(self, v, u);
        }

        st.pop_back();
    };

    dfs(dfs, 0, -1);

    auto dfs1 = [&](auto &&self, int u, int p) -> void {
        for (int v : adj[u]) {
            if (v == p) continue;
            self(self, v, u);
            for (int i = 0; i < 30; ++ i) {
                diff[u][i][0] += diff[v][i][0];
                diff[u][i][1] += diff[v][i][1];
            }
        }
    };

    dfs1(dfs1, 0, -1);

    for (int i = 0; i < n; ++ i) {
        for (int j = 0; j < 30; ++ j) {
            ans[i] = (ans[i] + 1LL * diff[i][j][0] * diff[i][j][1] % P * (1LL << j) % P) % P;
        }
    }

    for (int i = 0, x; i < q; ++ i) {
        std::cin >> x;
        std::cout << ans[x - 1] << '\n';
    }
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    int t = 1;
    // std::cin >> t;
    
    while (t--) {
        solve();
    }
    
    return 0;
}

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

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

相关文章

工作 6 年,@Transactional 注解用的一塌糊涂

接手新项目一言难尽&#xff0c;别的不说单单就一个 Transactional 注解用的一塌糊涂&#xff0c;五花八门的用法&#xff0c;很大部分还失效无法回滚。 有意识的在涉及事务相关方法上加Transactional注解&#xff0c;是个好习惯。不过&#xff0c;很多同学只是下意识地添加这个…

Redis的ZSet底层数据结构

一、ZSet底层数据结构 typedef struct zset{// 跳表zskiplist *zsl;// 字典dict *dic; }zset类型的底层数据结构是由压缩列表或跳表、**字典&#xff08;哈希表&#xff09;**实现的。 如果zset中元素个数小于128个&#xff0c;并且每个元素的值小于64字节时&#xff0c;redi…

Prompt提示词如何写才能发挥大语言模型LLM的最大潜力

提示词 提示工程学是一门相对较新的学科&#xff0c;用于开发和优化提示&#xff0c;以便高效地利用语言模型&#xff08;LM&#xff09;来进行各种应用和研究主题。提示工程技能有助于更好地了解大型语言模型&#xff08;LLM&#xff09;的能力和限制。研究人员使用提示工程来…

错误处理与日志记录:在自动化脚本中实施的有效策略

目录 引言 错误处理机制 1. 异常捕获与处理 2. finally子句 3. 异常信息的打印输出 日志记录 1. 使用logging模块 基本配置 日志级别 日志回滚 2. 自定义日志格式 3. 多处理器和过滤器 实践案例 自动化测试中的错误处理与日志记录 脚本示例 结论 在自动化测试领…

载流子的产生与复合

文章目录 前言有三种形式能够产生载流子 前言 半导体中能贡献导电作用的电子和空穴称为载流子 有三种形式能够产生载流子 热激发&#xff08;本征激发&#xff09;&#xff1a;价带中的电子受到热激发可能会跃迁至导带&#xff0c;成为能够起导电作用的电子&#xff0c;同时对…

给自己复盘用的tjxt笔记day12第一部分

优惠券使用 优惠券规则定义 对优惠券的下列需求: 判断一个优惠券是否可用,也就是检查订单金额是否达到优惠券使用门槛 按照优惠规则计算优惠金额,能够计算才能比较并找出最优方案 生成优惠券规则描述,目的是在页面直观的展示各种方案,供用户选择 因此,任何一张优惠券都…

SpringWeb 重定向

现在前端后分离&#xff1a;如何确认是跳转到前端页面还是后端的方法呢&#xff1f;RedirectView&#xff1a;重定向如何区分重定向的是前端页面还是后端的一个controller呢 先看下&#xff1a;SpringBoot系列教程web篇之重定向-阿里云开发者社区 ## 根据浏览器中返回的状态码…

vue3中,vue-echarts基本使用(关系图、知识图谱、柱状图、饼图、折线图)

vue3 安装vue-echarts npm i -S vue-echarts echarts//cnpm 安装 cnpm i -S vue-echarts echartsvue2 注意:Vue 2 下使用 vue-echarts,必须还要安装 @vue/composition-api : npm i -D @vue/composition-api //cnpm 安装 cnpm i -D @vue/composition-api main.js中全局注册…

【支付】PayPal支付通道注册(中国大陆、香港)

PayPal支付通道分个人版和企业版&#xff0c;在注册和功能以及收费上都有所区别&#xff0c;如果在测试阶段个人版也有sandbox账户&#xff08;包括Client ID和Secret&#xff09;&#xff0c;如果要切换到生产环境&#xff0c;会让你升级为企业版&#xff0c;只有企业版才可以…

华清远见元宇宙实验中心,开启嵌入式、物联网与人工智能教学新篇章

2024年8月23日&#xff0c;在北京举行的“匠心服务智启新程”2025新品发布会上&#xff0c;华清远见教育科技集团向行业展示了其最新的科技成果。其中最引人注目的焦点之一&#xff0c;莫过于元宇宙实验中心的发布。 正值华清远见教育科技集团20周年的里程碑时刻&#xff0c;这…

【零知识证明】构建第一个zk

1 必要步骤 视频学习&#xff1a;5. Circcom 中的基本算术电路_哔哩哔哩_bilibili 文字学习&#xff1a;https://hackmd.io/YlNLZS2ESI21OSqdTW_mPw/S1jqN-h80/edit 第五课&#xff0c;circom实践&#xff0c;需要安装 1 vscode 2 rust&#xff1a;Windows安装Rust环境&…

深入了解 ThinkSNS:开源社交网络系统的强大力量

深入了解 ThinkSNS&#xff1a;开源社交网络系统的强大力量 一、概述 在如今的互联网时代&#xff0c;社交网络已成为人们生活中不可或缺的一部分。无论是企业还是个人开发者&#xff0c;都可能需要构建一个功能强大的社交平台。而在众多的解决方案中&#xff0c;ThinkSNS 脱颖…

MySQL数据库用户管理和授权

一、数据库用户管理 1. 创建用户 要创建新用户&#xff0c;可以使用 CREATE USER 语句。语法如下&#xff1a; CREATE USER 用户名来源地址 [IDENTIFIED BY [PASSWORD] 密码];用户名&#xff1a;指定要创建的用户名。来源地址&#xff1a;指定用户可以从哪些主机登录&#x…

【科研】如何查询导师的国家自然科学基金

国家自然科学基金查询工具 下拉则可以看到国自然基金 点进去可以看到相关的成果

【鸿蒙开发从0到1 day02】

css初体验 一.css引入方式二. 标签选择器三.类选择器四. id选择器五.通配符选择器六.画盒子七.文字控制属性八.水平对齐方式-图片九.文本修饰线十.文字颜色取值十一.调试工具十二.复合选择器十三.伪类选择器十四.css的特性十五.背景图十六.背景图位置十七.背景图的缩放十八.标签…

iOS巨魔商店免越狱作弊解决方案

众所周知&#xff0c;在iOS独特的闭源生态下&#xff0c;官方唯一的应用下载渠道是App Store&#xff0c;应用下载会经过层层审核与测试来保障其安全性与稳定性&#xff0c;未经审核的应用将无法下载到手机。 这一举措限制了用户获取非官方或破解版应用的可能性&#xff0c;与…

Java:泛型

文章目录 1 基础概念1.1 泛型概念1.2 泛型好处 2 泛型2.1 泛型类2.1.1. 泛型在父子继承关系上的表现 2.2 泛型接口2.2.1 案例 2.3 泛型方法2.4 泛型的通配2.5 泛型的擦除 1 基础概念 学习目标&#xff1a; 理解泛型的概念及掌握泛型的好处 泛型类、泛型接口的定义 理解泛型在…

机器学习课程学习周报十

机器学习课程学习周报十 文章目录 机器学习课程学习周报十摘要Abstract一、机器学习部分1.1 生成对抗网络1.2 生成器与辨别器的训练过程1.3 信息论1.3.1 信息量1.3.2 熵1.3.3 交叉熵1.3.4 相对熵/KL散度1.3.5 交叉熵损失函数1.3.6 JS散度 1.4 GAN的理论介绍 总结 摘要 本周学习…

知识竞赛活动中的一些新颖特殊的赛制

以下知识竞赛海活动一些特殊新颖的竞赛规则&#xff0c;可以作为特殊情况下的参考。 &#xff08;一&#xff09;争分夺秒 答题选手&#xff1a;各队1号选手。1和2号队、3和4号队、5和6号队、7和8号队各为一组。 答题步骤&#xff1a;1号队和2号队1号选手同时离开座位&#x…

企业如何防止内部人员泄密?(5种方法详细说明)

企业内部信息泄密问题已经成为许多企业的严重威胁。随着数字化办公的普及&#xff0c;企业信息泄密的风险越来越高。内部人员泄密问题更是防不胜防&#xff0c;因此企业必须采取有效的措施来防止内部人员泄密。以下是五种可以帮助企业防止内部人员泄密的方法&#xff1a; 1. 使…