树上前缀和详解

news2024/11/16 19:31:35

零、前言

关于前缀和:

前缀和详解,朴素前缀和,前缀和变形,二维前缀和_前缀积-CSDN博客

关于LCA:

LCA算法-倍增算法_lca倍增算法-CSDN博客

LCA算法-Tarjan算法_lca数组-CSDN博客

树链剖分——重链剖分,原理剖析,代码详解-CSDN博客


一、树上前缀和

1.1 问题引入

给定一棵 n 个节点的树,多次询问 x, y 路径上的节点和。

对于一次询问,我们可以一次dfs解决,如果多次,我们就要用树上前缀和了。

1.2 点前缀和

设 acc[i] 表示从根节点到节点 i 的点权和。

先自顶向下 dfs 计算出前缀和 acc[],然后用 前缀和 拼凑(x, y)的路径和。

acc[x] + acc[y] - acc[lca(x, y)] - acc[fa(lca)]

1.3 边前缀和

设 acc[i] 表示从根节点到节点i的边权和

先自顶向下 dfs 计算出前缀和 acc[],然后用 前缀和 拼凑(x, y)的路径和。

acc[x] + acc[y] - 2 · acc[lca(x, y)]

二、OJ练习

2.1 BJOI2018 求和

原题链接

[P4427 BJOI2018] 求和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路分析

先建图,然后 dfs 预处理 acc[][], acc[j][i] 代表从根节点到 i 路径上节点的 深度的 j 次方 之和

对于每个查询,我们求 lca,输出结果即可

AC代码

#include <bits/stdc++.h>

// #define DEBUG

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

constexpr int inf32 = 1E9 + 7;
constexpr i64 inf64 = 1E18 + 7;

constexpr int P = 998244353;
constexpr int B = 19;
constexpr int K = 50;

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

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

    std::vector<int> d(n);

    std::vector<std::vector<int>> acc(K + 1, std::vector<int>(n));

    std::vector<std::array<int, B>> f(n, std::array<int, B>{});

    auto dfs = [&](auto &&self, int u, int p) -> void {
        if (u) {
            f[u][0] = p;
            for (int i = 1; i < B; ++ i) {
                f[u][i] = f[f[u][i - 1]][i - 1];
            }
        }

        for (int i = 0, val = 1; i <= K; ++ i) {
            acc[i][u] = val;
            if (u) {
                acc[i][u] += acc[i][p];
                if (acc[i][u] >= P)
                    acc[i][u] -= P;
            }
            val = 1LL * val * d[u] % P;
        }

        for (int v : adj[u]) {
            if (v == p) continue;
            d[v] = d[u] + 1;

            self(self, v, u);
        }
    };

    dfs(dfs, 0, -1);

    auto LCA = [&](int u, int v) -> int {
        if (d[u] < d[v]) std::swap(u, v);
        for (int i = B - 1; ~i; -- i)
            if (d[f[u][i]] >= d[v])
                u = f[u][i];

        if (u == v)
            return u;

        for (int i = B - 1; ~i; -- i)
            if (f[u][i] != f[v][i]) {
                u = f[u][i];
                v = f[v][i];
            }

        return f[u][0];
    }; 

    int m;
    std::cin >> m;

    for (int i = 0, u, v, k; i < m; ++ i) {
        std::cin >> u >> v >> k;
        -- u, -- v;
        int lca = LCA(u, v);
        int ans = ((acc[k][u] + acc[k][v] - acc[k][lca]) % P + P) % P;
        if (lca)
            ans = ((ans - acc[k][f[lca][0]]) % P + P) % P;
        std::cout << ans << '\n';
    }
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

#ifdef DEBUG
    int cur = clock();
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif

    int t = 1;
    // std::cin >> t;

    while (t--) {
        solve();
    }
#ifdef DEBUG
    std::cerr << "run-time: " << clock() - cur << '\n';
#endif
    return 0;
}

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

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

相关文章

IGZO基底无电容DRAM单元前景看好

1.DRAM技术简介 DRAM&#xff08;Dynamic Random Access Memory&#xff0c;动态随机存取存储器&#xff09;是一种用于计算机和其他电子设备中的主存储器类型&#xff0c;其主要由存储单元阵列构成&#xff0c;而每一个存储单元由一个电容器和一个晶体管组成&#xff0c;如图…

自动驾驶热成像物体检测数据集-热成像数据集-汽车行人热成像数据集

标签 物体检测fila data set模型 类别 (4) 自行车汽车狗人 度量指标 平均精度均值 (mAP)&#xff1a;88.8%准确率 (Precision)&#xff1a;92.0%召回率 (Recall)&#xff1a;78.9% 尝试此模型 上传一张图片或者从您的设备中选择 描述 自动驾驶热成像物体检测 概述 该…

重回1899元,小米这新机太猛了

如果不出意外&#xff0c;距离高通年度旗舰骁龙 8 Gen4 发布还剩下不到一个月时间。 对于以小米 15 为首即将到来的下半年各家旗舰机型厮杀画面&#xff0c;讲道理小忆早已是备好瓜子儿摆上果盘翘首以盼了。 不过在这之前&#xff0c;中端主流选手们表示有话要说&#xff1a;为…

React UI组件库推荐

Next UI&#xff1a;Vite | NextUI - Beautiful, fast and modern React UI Library Ant Design&#xff1a;Ant Design - 一套企业级 UI 设计语言和 React 组件库

Kafka系列之:安装使用kafka_exporter详细步骤

Kafka系列之:安装使用kafka_exporter详细步骤 一、kafka_exporter二、下载kafka_exporter三、理解Topic Metrics指标四、理解Consumer Groups Metrics指标五、启动kafka_exporter六、查看页面七、systemctl托管服务一、kafka_exporter kafka_exporter源码kafka_exporter下载页…

【大模型对话 的界面搭建-Open WebUI】

Open WebUI 前身就是 Ollama WebUI&#xff0c;为 Ollama 提供一个可视化界面&#xff0c;可以完全离线运行&#xff0c;支持 Ollama 和兼容 OpenAI 的 API。 github网址 https://github.com/open-webui/open-webui安装 第一种 docker安装 如果ollama 安装在同一台服务器上&…

餐饮平价时代到来,价格战只是开始

餐饮正在变天。 “‘活得好’要排在第一位&#xff0c;‘做大做强’往后排。”9月25日&#xff0c;西贝餐饮董事长贾国龙在某餐饮行业论坛上透露&#xff0c;上周与海底捞创始人张勇通电话聊了15分钟&#xff0c;一致认为现在要保利润率&#xff0c;而不是保增长率。 2021年开…

babylon.js-1:入门篇

最近项目中使用到了 Babylon.js 这门技术&#xff0c;从今天开始&#xff0c;抽取自己写的比较好的拿出来&#xff0c;作为分享案例&#xff1a; 记录学习成果通过笔记的方式记录技术积累方便工作中查找翻阅实现案例 是什么 Babylon.js是一个基于WebGL的开源3D渲染引擎&…

为什么优秀的工厂更重视生产现场

在日本的企业界&#xff0c;“现场”这个词就如同“改善”一样&#xff0c;被管理者普遍使用。优秀的公司&#xff0c;总是把“现场”摆在组织的最顶端&#xff0c;表示对它的重视。 组织中的各个阶层——高级管理阶层、中级管理阶层、工程师和现场督导人员&#xff0c;都是因…

javascript promise的使用

Promise是异步编程的一种解决方案。 它能优雅的方式来处理异步操作&#xff0c;避免产生回调地狱&#xff0c;这样的代码难看而且不容易维护。 普通方式调用&#xff1a;处理异常的时候&#xff0c;用逗号隔开 链式调用&#xff1a; // 1.使用setTimeout// setTimeout(() >…

postman发送与返回,GET与POST使用

1.GET 获取主页 发送&#xff1a; uri: ‘/’ 返回&#xff1a; 2.POST 发送密码 发送&#xff1a; uri: ‘/login.html’ 返回&#xff1a; 3.POST 保存参数 发送&#xff1a; 返回&#xff1a; 4.GET 获取参数 在POST密码之后&#xff0c;服务器发送一个H…

c语言手撕内存池组件

内存池是什么&#xff1f; 内存池&#xff08;Memory Pool&#xff09;是一种内存管理技术&#xff0c;它预先分配一大块内存&#xff0c;然后将其分成多个固定大小的小块。这些小块被组织起来&#xff0c;用于程序在运行期间频繁进行的内存分配和释放操作。内存池通过创建一个…

精选10个热门目标检测数据集

目标检测&#xff08;Object Detection&#xff09;的任务是找出图像中所有感兴趣的目标&#xff08;物体&#xff09;&#xff0c;确定它们的类别和位置&#xff0c;是计算机视觉领域的核心问题之一&#xff0c;也是近年来研究数量以及应用范围较为广泛的一个领域。在对自动化…

出海快报 | 爆款休闲手游半年爆增3倍,《无尽冬日》海外版累计收入破10亿美元

TopOn出海快报栏目为互联网出海从业者梳理每周出海热点&#xff0c;最值得关注的 Top 5 出海新闻&#xff0c;供大家了解行业最新发展态势。 SLG超级爆款《无尽冬日》海外版累计收入破10亿美元 手游市场分析公司Sensor Tower最近发文称&#xff0c;《Whiteout Survival》累计&a…

2024年【茶艺师(高级)】考试资料及茶艺师(高级)考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 茶艺师&#xff08;高级&#xff09;考试资料考前必练&#xff01;安全生产模拟考试一点通每个月更新茶艺师&#xff08;高级&#xff09;考试总结题目及答案&#xff01;多做几遍&#xff0c;其实通过茶艺师&#xf…

怎么做二维码预览文件?文件长期扫码展示的制作技巧怎么做二维码预览文件?文件长期扫码展示的制作技巧

在日常生活中每天都会接触不同类型的文件&#xff0c;想要快速将文件与其他人共享&#xff0c;可以将文件生成二维码&#xff0c;让其他人通过扫码来预览或者下载文件。二维码的优势在于能够长期存储文件&#xff0c;简化其他人获取文件的流程&#xff0c;而且能够随时替换文件…

美业系统哪个好用?美业SAAS系统管理系统收银系统怎么选择?

当选择美业收银系系统管理系统时&#xff0c;有几个关键因素需要考虑&#xff1a; • 功能全面性&#xff1a; 确保系统能够满足您店铺的所有需求&#xff0c;包括但不限于预约管理、客户关系管理、库存管理、员工排班、销售报表等。您需要评估系统是否提供了您所需的所有功能…

Simple Calculator(简单计算器:算法初阶,代码基础,“纯”手撕)

简单计算器&#xff1a;仅适用无括号加减乘除&#xff0c;算法初阶&#xff0c;代码基础&#xff0c;不调库或模块“纯”手撕。 (笔记模板由python脚本于2024年09月22日 12:08:02创建&#xff0c;本篇笔记适合喜欢用python解决实际问题的coder翻阅) 【学习的细节是欢悦的历程】…

负载均衡--相关面试题(六)

在负载均衡的面试中&#xff0c;可能会遇到一系列涉及概念、原理、实践应用以及技术细节的问题。以下是一些常见的负载均衡面试题及其详细解答&#xff1a; 一、什么是负载均衡&#xff1f; 回答&#xff1a;负载均衡是一种将网络请求或数据传输工作分配给多个服务器或网络资源…

微服务SpringSession解析部署使用全流程

1、SpringSession简介 是SpringCloud下管理session的框架&#xff0c;在微服务架构中&#xff0c;由于应用了分布式的思想&#xff0c;session无法做到内存中互通&#xff0c;需要一个框架来实现各个微服务中session数据共享&#xff0c;SpringSession解决了这个问题。 在Spr…