【BJOI2018】求和 - 倍增LCA
题目描述
$master$ 对树上的求和非常感兴趣。他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的$k$次方和,而且每次的$k$可能是不同的。此处节点深度的定义是这个节点到根的路径上的边数。他把这个问题交给了$pupil$,但$pupil$ 并不会这么复杂的操作,你能帮他解决吗?
输入输出格式
输入格式:
第一行包含一个正整数n,表示树的节点数。
之后n-1行每行两个空格隔开的正整数i, j ,表示树上的一条连接点$i$和点$j$的边。
之后一行一个正整数m ,表示询问的数量。
之后每行三个空格隔开的正整数i, j, k,表示询问从点i到点j的路径上所有节点深度的k次方和。由于这个结果可能非常大,输出其对998244353取模的结果。
树的节点从1开始标号,其中1号节点为树的根。
输出格式:
对于每组数据输出一行一个正整数表示取模后的结果。
思路
对$k=1...50$全部预处理出来,然后就是LCA模板题了
#include <bits/stdc++.h>
using namespace std;
const long long maxn = 300000 + 10;
const long long MOD = 998244353;
long long n,m,dep[maxn],father[maxn][25],d[maxn][51];
vector<long long> edges[maxn];
inline long long quickpow(long long x,long long y) {
long long ans = 1;
for (;y;y >>= 1,x = x*x%MOD) if (y&1) ans = ans*x%MOD;
return ans;
}
inline void dfs(long long now,long long fa) {
dep[now] = dep[fa]+1;
for (long long j = 1;j <= 50;j++) d[now][j] = quickpow(dep[now],j)+d[fa][j];
for (long long i = 0;i < edges[now].size();i++)
if (edges[now][i] != fa) {
dfs(edges[now][i],now);
father[edges[now][i]][0] = now;
}
}
inline void init() {
for (long long j = 1;(1<<j) <= n;j++)
for (long long i = 1;i <= n;i++)
father[i][j] = father[father[i][j-1]][j-1];
}
inline long long lca(long long a,long long b) {
if (dep[a] < dep[b]) swap(a,b);
for (long long i = 20;i >= 0;i--)
if (dep[father[a][i]] >= dep[b]) a = father[a][i];
if (a == b) return a;
for (long long i = 20;i >= 0;i--)
if (father[a][i] != father[b][i]) {
a = father[a][i];
b = father[b][i];
}
return father[a][0];
}
int main() {
scanf("%lld",&n);
for (long long i = 1,u,v;i < n;i++) {
scanf("%lld%lld",&u,&v);
edges[u].push_back(v);
edges[v].push_back(u);
}
dep[1] = -1;
father[1][0] = 1;
dfs(1,1);
init();
scanf("%lld",&m);
while (m--) {
long long a,b,k,LCA;
scanf("%lld%lld%lld",&a,&b,&k);
LCA = lca(a,b);
printf("%lld\n",((d[a][k]+d[b][k])-(d[LCA][k]+d[father[LCA][0]][k]))%MOD);
}
return 0;
}
【BJOI2018】求和 - 倍增LCA的更多相关文章
- [BZOJ5293][BJOI2018]求和(倍增)
裸的树上倍增. #include<cstdio> #include<cstring> #include<algorithm> #define rep(i,l,r) ...
- 【BZOJ5293】[BJOI2018]求和(前缀和,LCA)
[BZOJ5293][BJOI2018]求和(前缀和,LCA) 题面 BZOJ 洛谷 题解 送分题??? 预处理一下\(k\)次方的前缀和. 然后求个\(LCA\)就做完了?... #include& ...
- bzoj5293: [Bjoi2018]求和
题目链接 bzoj5293: [Bjoi2018]求和 题解 暴力 对于lca为1的好坑啊.... 代码 #include<cmath> #include<cstdio> #i ...
- P4427 [BJOI2018]求和
P4427 [BJOI2018]求和 同[TJOI2018]教科书般的扭曲虚空 懒得写了(雾 #include<bits/stdc++.h> #define il inline #defi ...
- [板子]倍增LCA
倍增LCA板子,没有压行,可读性应该还可以.转载请随意. #include <cstdio> #include <cstring> #include <algorithm ...
- 洛谷P3128 [USACO15DEC]最大流Max Flow [倍增LCA]
题目描述 Farmer John has installed a new system of pipes to transport milk between the stalls in his b ...
- Gym100685G Gadget Hackwrench(倍增LCA)
题目大概说一棵边有方向的树,q个询问,每次询问结点u是否能走到v. 倍增LCA搞即可: 除了par[k][u]表示u结点往上走2k步到达的结点, 再加上upp[k][u]表示u结点往上走2k步经过边的 ...
- Codeforces 418d Big Problems for Organizers [树形dp][倍增lca]
题意: 给你一棵有n个节点的树,树的边权都是1. 有m次询问,每次询问输出树上所有节点离其较近结点距离的最大值. 思路: 1.首先是按照常规树形dp的思路维护一个子树节点中距离该点的最大值son_di ...
- hdu 4674 Trip Advisor(缩点+倍增lca)
花了一天半的时间,才把这道题ac= = 确实是道好题,好久没敲这么长的code了,尤其是最后的判定,各种销魂啊~ 题目中给出的条件最值得关注的就是:每个点最多只能在一个环内->原图是由一个个边连 ...
随机推荐
- css属性inline-block的应用
1. 让两个块级元素处于同一行 2. 需要元素撑开边框的时候
- js JQ动态添加div标签
function renderList(data){ var str = ''; for(var i = 0; i < data.length; i++){ // 动态添加li str += ' ...
- 我在 GitHub 上发现了一款骚气满满的字体!
本文转自量子位,作者栗体,如有侵权,则可删除. github字体 这个字体叫 Leon Sans,表面看去平平无奇. 但事实上,它并不是普通的字体,体内蕴藏着魔力. github字体1 Leon Sa ...
- jenkins集群(四) -- 持续集成
一.jenkins配置git 1.安装源码管理器 git:http://updates.jenkins-ci.org/download/plugins/git/ 去上面的网址中把离线插件下载下来,然 ...
- [转]jquery如何判断checkbox(复选框)是否被选中,至少被选中一个
谁都知道 在html 如果一个复选框被选中 是 checked="checked". 但是我们如果用jquery alert($("#id").attr(&qu ...
- Python os.fsync() 方法
概述 os.fsync() 方法强制将文件描述符为fd的文件写入硬盘.在Unix, 将调用fsync()函数;在Windows, 调用 _commit()函数.高佣联盟 www.cgewang.com ...
- PHP usort() 函数
------------恢复内容开始------------ 实例 使用用户自定义的比较函数对数组 $a 中的元素进行排序:Sort the elements of the $a array usin ...
- PHP get_browser() 函数
实例 查阅用户的 browscap.ini 文件,并返回用户浏览器的性能: <?phpecho $_SERVER['HTTP_USER_AGENT'];$browser = get_browse ...
- 环境篇:数据同步工具DataX
环境篇:数据同步工具DataX 1 概述 https://github.com/alibaba/DataX DataX是什么? DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 ...
- CMD使用笔记
CMD杂谈 基本功: 1,列出所有任务及进程号,杀进程 tasklist tasklist /? 获取使用帮助 taskkill taskkill /? 获取使用帮助 2,cd 切换目录 cd ...