【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了,尤其是最后的判定,各种销魂啊~ 题目中给出的条件最值得关注的就是:每个点最多只能在一个环内->原图是由一个个边连 ...
随机推荐
- 【requests库】七个主要方法
本文主要介绍requests库访问http的七个主要方法:get.head.post.put.patch.delete. requests.get()方法 get方法用于获取指定url的HTML网页, ...
- java enum 枚举类
图一代码: public enum LogMethodEnum { WEBCSCARDVALID("返回值"), WEBCSVERIFYPASSWORD("返回值&quo ...
- 面试题四十三:在1~n整数中1出现的次数
方法一:直观来看,遍历1到n,每个数去做%10的循环判断 int Number1_B_1toN( int n){ int sum=0; for(int i=1;i<=n;i++){ int k= ...
- CentOS7.3 ffmpeg安装
ffmpeg安装笔记 ======================== 一.安装依赖 yum -y install yum-utils yum-config-manager --add-repo ht ...
- HTTP Keep-Alive的作用
作用: Keep-Alive:使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接.Web服务器,基本上都支持HTTP Keep-Alive ...
- Day15_redis安装及配置
学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 redi ...
- PHP preg_replace() 函数
preg_replace 函数执行一个正则表达式的搜索和替换.高佣联盟 www.cgewang.com 语法 mixed preg_replace ( mixed $pattern , mixed $ ...
- CF R 639 div2 F Review 贪心 二分
LINK:Résumé Review 这道题让我眼前一亮没想到二分这么绝. 由于每个\(b_i\)都是局部的 全局只有一个限制\(\sum_{i=1}^nb_i=k\) 所以dp没有什么用 我们只需要 ...
- log4j2 自动删除过期日志文件配置及实现原理解析
日志文件自动删除功能必不可少,当然你可以让运维去做这事,只是这不地道.而日志组件是一个必备组件,让其多做一件删除的工作,无可厚非.本文就来探讨下 log4j 的日志文件自动删除实现吧. 0. 自动删除 ...
- MySQL的undo/redo日志和binlog日志,以及2PC
发现自己的知识点有点散,今天就把它们连接起来,好好总结一下. 一.undo log.redo log.binlog的定义和对比 定义和作用 所在架构层级 ...