预处理,树上差分。注意深度减一

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #define R(a,b,c) for(register int a = (b); (a) <= (c); ++(a))
  7. #define nR(a,b,c) for(register int a = (b); (a) >= (c); --(a))
  8. #define Fill(a,b) memset(a, b, sizeof(a))
  9. #define Max(a,b) ((a) > (b) ? (a) : (b))
  10. #define Min(a,b) ((a) < (b) ? (a) : (b))
  11. #define Swap(a,b) ((a) ^= (b) ^= (a) ^= (b))
  12. //#define ON_DEBUGG
  13. #ifdef ON_DEBUGG
  14. #define D_e_Line printf("\n----------\n")
  15. #define D_e(x) cout << (#x) << " : " << x << endl
  16. #define Pause() system("pause")
  17. #define FileOpen() freopen("in.txt", "r", stdin)
  18. #else
  19. #define D_e_Line ;
  20. #define D_e(x) ;
  21. #define Pause() ;
  22. #define FileOpen() ;
  23. #endif
  24. using namespace std;
  25. struct ios{
  26. template<typename ATP>inline ios& operator >> (ATP &x){
  27. x = 0; int f = 1; char ch;
  28. for(ch = getchar(); ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;
  29. while(ch >= '0' && ch <= '9') x = x * 10 + (ch ^ '0'), ch = getchar();
  30. x *= f;
  31. return *this;
  32. }
  33. }io;
  34. const int N = 300007;
  35. const int mod = 998244353;
  36. #define int long long
  37. struct Edge{
  38. int nxt, pre;
  39. }e[N << 1];
  40. int head[N], cntEdge;
  41. inline void add(int u, int v){
  42. e[++cntEdge] = (Edge){ head[u], v}, head[u] = cntEdge;
  43. }
  44. int maxDep;
  45. int fa[N], son[N], dep[N], siz[N];
  46. inline void DFS_First(int u, int father){
  47. dep[u] = dep[father] + 1, fa[u] = father, siz[u] = 1;
  48. maxDep = Max(maxDep, dep[u]); //re define maxDep
  49. for(register int i = head[u]; i; i = e[i].nxt){
  50. int v = e[i].pre;
  51. if(v == father) continue;
  52. DFS_First(v, u);
  53. siz[u] += siz[v];
  54. if(!son[u] || siz[v] > siz[son[u]]){
  55. son[u] = v;
  56. }
  57. }
  58. }
  59. int top[N], rnk[N], dfn[N], dfnIndex;
  60. inline void DFS_Second(int u, int ancester){
  61. top[u] = ancester, dfn[u] = ++dfnIndex, rnk[dfnIndex] = u;
  62. if(!son[u]) return;
  63. DFS_Second(son[u], ancester);
  64. for(register int i = head[u]; i; i = e[i].nxt){
  65. int v = e[i].pre;
  66. if(v != son[u] && v != fa[u])
  67. DFS_Second(v, v);
  68. }
  69. }
  70. int val[51][N], p[N][51];
  71. inline int Query(int x, int y, int K){
  72. int sum = 0;
  73. while(top[x] != top[y]){
  74. if(dep[top[x]] < dep[top[y]]) Swap(x, y);
  75. sum = (sum + val[K][dfn[x]] - val[K][dfn[top[x]] - 1] + mod) % mod;
  76. x = fa[top[x]];
  77. }
  78. //D_e(sum);
  79. if(dep[x] < dep[y]) Swap(x, y);
  80. return (sum + val[K][dfn[x]] - val[K][dfn[y] - 1] + mod) % mod;
  81. }
  82. #undef int
  83. int main(){
  84. #define int long long
  85. FileOpen();
  86. int n;
  87. io >> n;
  88. R(i,2,n){
  89. int u, v;
  90. io >> u >> v;
  91. add(u, v);
  92. add(v, u);
  93. }
  94. DFS_First(1, 0);
  95. DFS_Second(1, 1);
  96. --maxDep;
  97. R(i,1,n) --dep[i]; // !!!!!!
  98. R(i,1,maxDep){
  99. p[i][1] = i;
  100. R(k,2,50){
  101. p[i][k] = p[i][k - 1] * i % mod;
  102. //D_e(p[i][k]);
  103. }
  104. }
  105. R(k,1,50){
  106. R(i,1,n){
  107. val[k][i] = (val[k][i - 1] + p[dep[rnk[i]]][k]) % mod;//, D_e(val[k][i]);
  108. }
  109. }
  110. int Ques;
  111. io >> Ques;
  112. while(Ques--){
  113. int x, y, K;
  114. io >> x >> y >> K;
  115. printf("%lld\n", Query(x, y, K));
  116. }
  117. return 0;
  118. }

Luogu4427 [BJOI2018]求和 (树上差分)的更多相关文章

  1. BZOJ5293: [Bjoi2018]求和 树上差分

    Description master 对树上的求和非常感兴趣.他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的k  次方和,而且每次的k 可能是不同的.此处节点深度的定义是这个节点 ...

  2. BZOJ5293:[BJOI2018]求和(LCA,差分)

    Description master 对树上的求和非常感兴趣.他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的k  次方和,而且每次的k 可能是不同的.此处节点深度的定义是这个节点 ...

  3. poj3417lca+树上差分

    /* 给定n个点的树,在其中加入m条新边(称为非树边) 现在可以割断一条树边,一条非树边,使图分裂成两个联通块,请问有几种切割方式 对树边进行分情况讨论 如果树边不处在环中,则割断这条树边后可以割断任 ...

  4. BZOJ4999 This Problem Is Too Simple!(树上差分+dfs序+树状数组)

    对每个权值分别考虑.则只有单点加路径求和的操作.树上差分转化为求到根的路径和,子树加即可.再差分后bit即可.注意树上差分中根的父亲是0,已经忘了是第几次因为这个挂了. #include<ios ...

  5. [luogu]P2680 运输计划[二分答案][树上差分]

    [luogu]P2680 [NOIP2015]运输计划 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n ...

  6. 【题解】CF986E Prince's Problem(树上差分+数论性质)

    [题解]CF986E Prince's Problem(树上差分+数论性质) 题目大意: 给定你一棵树,有点权\(val_i\le 10^7\).现在有\(m\)组询问给定参数\(x,y,w\)问你对 ...

  7. 【BZOJ-4326】运输计划 树链剖分 + 树上差分 + 二分

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 703  Solved: 461[Submit][Status] ...

  8. [luogu P3128][USACO15DEC]Max Flow [LCA][树上差分]

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

  9. 树上差分 (瞎bb) [树上差分][LCA]

    做noip2015的运输计划写了好久好久写不出来   QwQ 于是先来瞎bb一下树上差分    混积分 树上差分有2个常用的功能: (1)记录从点i到i的父亲这条路径走过几次 (2)将每条路径(s,t ...

随机推荐

  1. 新建Vue项目记得几个配置

    1.在APP.vue文件夹中进行CSS初始化 2.下载vuex,vue-router,并配置 3.关闭语法检查vue.config.js 4.按需引入组件库

  2. SPPNet(特征金字塔池化)学习笔记

    SPPNet paper:Spatial pyramid pooling in deep convolutional networks for visual recognition code 首先介绍 ...

  3. 聚类--DBSCN

    1.什么是DBSCN DBSCAN也是一个非常有用的聚类算法. 它的主要优点:它不需要用户先验地设置簇的个数,可以划分具有复杂形状的簇,还可以找出不属于任何簇的点. DBSCAN比凝聚聚类和k均值稍慢 ...

  4. uni-simple-router

    目录 uni-simple-router 一.快速上手 扩一:webpack插件之DefinePlugin 扩二:uni-read-pages 如何获取pages.json中的路由 二.H5模式 2. ...

  5. neo4j中重复节点问题

    neo4j中重复节点问题 neo4j中,在导入csv文件时,可能会出现有重复节点的现象.可以分为以下步骤解决:1.先查看下某个标签下的节点总数match (n:PERSON) return count ...

  6. 用一个性能提升了666倍的小案例说明在TiDB中正确使用索引的重要性

    背景 最近在给一个物流系统做TiDB POC测试,这个系统是基于MySQL开发的,本次投入测试的业务数据大概10个库约900张表,最大单表6千多万行. 这个规模不算大,测试数据以及库表结构是用Dump ...

  7. (1)《QT+OpenGL学习之我见》初始化窗口及三个重要函数 vs+Qt

    本章前言:本章讲如何利用VS和QT来创建一个基本的QOpenGLWidget窗口和有关联的三个核心函数,因为版本更新可能会有大同小异,但基本的不会有变换,有了QT的帮助,我们不需要下载opengL.g ...

  8. 如何从0开发一个Vue组件库并发布到npm

    1.新建文件夹在终端打开执行 npm init -y 生成package.json如下,注意如果要发布到npm,name不能有下划线,大写字母等 { "name": "v ...

  9. QT5 QSS QML界面美化视频课程系列 QT原理 项目实战 C++1X STL

    QT5 QSS QML界面美化视频课程系列 QT原理 项目实战 C++1X STL 课程1   C语言程序设计高级实用速成课程 基础+进阶+自学 课程2   C语言程序设计Windows GDI图形绘 ...

  10. 用console画条龙?

    相识 console一定是各位前端er最熟悉的小伙伴了,无论是console控制台,还是console对象,做前端做久了,打开一个网页总是莫名自然的顺手打开控制台,有些调皮的网站还会故意在控制台输出一 ...