题目描述

$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模板题了

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const long long maxn = 300000 + 10;
  4. const long long MOD = 998244353;
  5. long long n,m,dep[maxn],father[maxn][25],d[maxn][51];
  6. vector<long long> edges[maxn];
  7. inline long long quickpow(long long x,long long y) {
  8. long long ans = 1;
  9. for (;y;y >>= 1,x = x*x%MOD) if (y&1) ans = ans*x%MOD;
  10. return ans;
  11. }
  12. inline void dfs(long long now,long long fa) {
  13. dep[now] = dep[fa]+1;
  14. for (long long j = 1;j <= 50;j++) d[now][j] = quickpow(dep[now],j)+d[fa][j];
  15. for (long long i = 0;i < edges[now].size();i++)
  16. if (edges[now][i] != fa) {
  17. dfs(edges[now][i],now);
  18. father[edges[now][i]][0] = now;
  19. }
  20. }
  21. inline void init() {
  22. for (long long j = 1;(1<<j) <= n;j++)
  23. for (long long i = 1;i <= n;i++)
  24. father[i][j] = father[father[i][j-1]][j-1];
  25. }
  26. inline long long lca(long long a,long long b) {
  27. if (dep[a] < dep[b]) swap(a,b);
  28. for (long long i = 20;i >= 0;i--)
  29. if (dep[father[a][i]] >= dep[b]) a = father[a][i];
  30. if (a == b) return a;
  31. for (long long i = 20;i >= 0;i--)
  32. if (father[a][i] != father[b][i]) {
  33. a = father[a][i];
  34. b = father[b][i];
  35. }
  36. return father[a][0];
  37. }
  38. int main() {
  39. scanf("%lld",&n);
  40. for (long long i = 1,u,v;i < n;i++) {
  41. scanf("%lld%lld",&u,&v);
  42. edges[u].push_back(v);
  43. edges[v].push_back(u);
  44. }
  45. dep[1] = -1;
  46. father[1][0] = 1;
  47. dfs(1,1);
  48. init();
  49. scanf("%lld",&m);
  50. while (m--) {
  51. long long a,b,k,LCA;
  52. scanf("%lld%lld%lld",&a,&b,&k);
  53. LCA = lca(a,b);
  54. printf("%lld\n",((d[a][k]+d[b][k])-(d[LCA][k]+d[father[LCA][0]][k]))%MOD);
  55. }
  56. return 0;
  57. }

【BJOI2018】求和 - 倍增LCA的更多相关文章

  1. [BZOJ5293][BJOI2018]求和(倍增)

    裸的树上倍增. #include<cstdio> #include<cstring> #include<algorithm> #define rep(i,l,r) ...

  2. 【BZOJ5293】[BJOI2018]求和(前缀和,LCA)

    [BZOJ5293][BJOI2018]求和(前缀和,LCA) 题面 BZOJ 洛谷 题解 送分题??? 预处理一下\(k\)次方的前缀和. 然后求个\(LCA\)就做完了?... #include& ...

  3. bzoj5293: [Bjoi2018]求和

    题目链接 bzoj5293: [Bjoi2018]求和 题解 暴力 对于lca为1的好坑啊.... 代码 #include<cmath> #include<cstdio> #i ...

  4. P4427 [BJOI2018]求和

    P4427 [BJOI2018]求和 同[TJOI2018]教科书般的扭曲虚空 懒得写了(雾 #include<bits/stdc++.h> #define il inline #defi ...

  5. [板子]倍增LCA

    倍增LCA板子,没有压行,可读性应该还可以.转载请随意. #include <cstdio> #include <cstring> #include <algorithm ...

  6. 洛谷P3128 [USACO15DEC]最大流Max Flow [倍增LCA]

    题目描述 Farmer John has installed a new system of  pipes to transport milk between the  stalls in his b ...

  7. Gym100685G Gadget Hackwrench(倍增LCA)

    题目大概说一棵边有方向的树,q个询问,每次询问结点u是否能走到v. 倍增LCA搞即可: 除了par[k][u]表示u结点往上走2k步到达的结点, 再加上upp[k][u]表示u结点往上走2k步经过边的 ...

  8. Codeforces 418d Big Problems for Organizers [树形dp][倍增lca]

    题意: 给你一棵有n个节点的树,树的边权都是1. 有m次询问,每次询问输出树上所有节点离其较近结点距离的最大值. 思路: 1.首先是按照常规树形dp的思路维护一个子树节点中距离该点的最大值son_di ...

  9. hdu 4674 Trip Advisor(缩点+倍增lca)

    花了一天半的时间,才把这道题ac= = 确实是道好题,好久没敲这么长的code了,尤其是最后的判定,各种销魂啊~ 题目中给出的条件最值得关注的就是:每个点最多只能在一个环内->原图是由一个个边连 ...

随机推荐

  1. DC-1靶机实战和分析

    前言 我们都知道,对靶机的渗透,可以宽阔自己的解题思路,练习并熟悉相关操作命令,提高自己的能力.下面我就对Vulnhub的DC-1靶机进行渗透,靶机设置了5个flag,咱们依次找到它.并通过图文形式讲 ...

  2. jmeter接口测试 -- 数据库操作(mysql)

    一.操作类型 语句类型 1.查询语句 2.非查询语句 1)update 2)insert into 3)删除 二.把返回值的化为变量 1.执行语句,并引用变量 2.查看结果

  3. jenkins集群(三) -- master和slave配置git

    一.Linux(master)上安装git 1.运行命令:yum -y install git 2.git的默认安装目录是:  二.给Linux下Git配置好秘钥(公钥 + 私钥) 1.添加用户和密码 ...

  4. springboot(七)JavaMail发送邮件

    JavaMail简介: JavaMail是SUN提供给广大Java开发人员的一款邮件发送和接受的一款开源类库,支持常用的邮件协议,如:SMTP.POP3.IMAP,开发人员使用JavaMail编写邮件 ...

  5. Bug--WARN Please initialize the log4j system properly.

    log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory). log4j:WARN ...

  6. 简单了解InnoDB底层原理

    存储引擎 很多文章都是直接开始介绍有哪些存储引擎,并没有去介绍存储引擎本身.那么究竟什么是存储引擎?不知道大家有没有想过,MySQL是如何存储我们丢进去的数据的? 其实存储引擎也很简单,我认为就是一种 ...

  7. JVM 学习笔记记录

    JVM 学习笔记记录 Sun JDK 监控和故障处理工具 名称 主要作用 jps JVM Process Status Tool, 显示指定系统内所有的HotSpot虚拟机进程 jstat JVM S ...

  8. numpy巩固

    导包 import numpy as np 创建二维数组 x = np.matrix([[1,2,3],[4,5,6]]) 创建一维数组 y = np.matrix([1,2,3,4,5,6]) x ...

  9. zabbix 监控nginx状态

    1. 安装nginx,参考其它 [root@iZ2zeapnvuohe8p14289u6Z /]# vim /etc/nginx/nginx.conf # 加上下面 location /nginx_s ...

  10. win10在html上运行java的applet程序

    Applet是采用Java编程语言编写的小应用程序,该程序可以包含在 HTML(标准通用标记语言的一个应用)页中,与在页中包含图像的方式大致相同. 含有Applet的网页的HTML文件代码中部带有 和 ...