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

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#define R(a,b,c) for(register int a = (b); (a) <= (c); ++(a))
#define nR(a,b,c) for(register int a = (b); (a) >= (c); --(a))
#define Fill(a,b) memset(a, b, sizeof(a))
#define Max(a,b) ((a) > (b) ? (a) : (b))
#define Min(a,b) ((a) < (b) ? (a) : (b))
#define Swap(a,b) ((a) ^= (b) ^= (a) ^= (b)) //#define ON_DEBUGG #ifdef ON_DEBUGG #define D_e_Line printf("\n----------\n")
#define D_e(x) cout << (#x) << " : " << x << endl
#define Pause() system("pause")
#define FileOpen() freopen("in.txt", "r", stdin) #else #define D_e_Line ;
#define D_e(x) ;
#define Pause() ;
#define FileOpen() ; #endif
using namespace std;
struct ios{
template<typename ATP>inline ios& operator >> (ATP &x){
x = 0; int f = 1; char ch;
for(ch = getchar(); ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;
while(ch >= '0' && ch <= '9') x = x * 10 + (ch ^ '0'), ch = getchar();
x *= f;
return *this;
}
}io; const int N = 300007;
const int mod = 998244353; #define int long long
struct Edge{
int nxt, pre;
}e[N << 1];
int head[N], cntEdge;
inline void add(int u, int v){
e[++cntEdge] = (Edge){ head[u], v}, head[u] = cntEdge;
} int maxDep;
int fa[N], son[N], dep[N], siz[N];
inline void DFS_First(int u, int father){
dep[u] = dep[father] + 1, fa[u] = father, siz[u] = 1;
maxDep = Max(maxDep, dep[u]); //re define maxDep
for(register int i = head[u]; i; i = e[i].nxt){
int v = e[i].pre;
if(v == father) continue;
DFS_First(v, u);
siz[u] += siz[v];
if(!son[u] || siz[v] > siz[son[u]]){
son[u] = v;
}
}
}
int top[N], rnk[N], dfn[N], dfnIndex;
inline void DFS_Second(int u, int ancester){
top[u] = ancester, dfn[u] = ++dfnIndex, rnk[dfnIndex] = u;
if(!son[u]) return;
DFS_Second(son[u], ancester);
for(register int i = head[u]; i; i = e[i].nxt){
int v = e[i].pre;
if(v != son[u] && v != fa[u])
DFS_Second(v, v);
}
}
int val[51][N], p[N][51];
inline int Query(int x, int y, int K){
int sum = 0;
while(top[x] != top[y]){
if(dep[top[x]] < dep[top[y]]) Swap(x, y);
sum = (sum + val[K][dfn[x]] - val[K][dfn[top[x]] - 1] + mod) % mod;
x = fa[top[x]];
}
//D_e(sum);
if(dep[x] < dep[y]) Swap(x, y);
return (sum + val[K][dfn[x]] - val[K][dfn[y] - 1] + mod) % mod;
} #undef int
int main(){
#define int long long
FileOpen();
int n;
io >> n;
R(i,2,n){
int u, v;
io >> u >> v;
add(u, v);
add(v, u);
} DFS_First(1, 0);
DFS_Second(1, 1); --maxDep;
R(i,1,n) --dep[i]; // !!!!!!
R(i,1,maxDep){
p[i][1] = i;
R(k,2,50){
p[i][k] = p[i][k - 1] * i % mod;
//D_e(p[i][k]);
}
}
R(k,1,50){
R(i,1,n){
val[k][i] = (val[k][i - 1] + p[dep[rnk[i]]][k]) % mod;//, D_e(val[k][i]);
}
} int Ques;
io >> Ques;
while(Ques--){
int x, y, K;
io >> x >> y >> K;
printf("%lld\n", Query(x, y, K));
} return 0;
}

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. 安装Samba到CentOS(YUM)

    运行环境 系统版本:CentOS Linux release 7.3.1611 软件版本:Samba-4.6.2 硬件要求:无 安装过程 1.基础网络配置 配置一个静态IP,关闭防火墙.SeLinux ...

  2. 【Tools】JAR怀旧模拟器推荐

    前段时间突然很怀念小时候玩的仙剑奇侠传,于是在网上各种找,功夫不负有心人,让我找到并且通关了.相信也有人需要.下面是截图. 下载地址:https://www.lanzous.com/ialmayh  

  3. 12.MYSQL基础-常见函数

    4. 常见函数 一.字符函数 概念 类似于Java的方法,将一组逻辑语句封装在方法中,对外暴露方法名 优点 隐藏了实现细节 提高代码的重用性 调用 select 函数名(实参列表) [ from 表] ...

  4. Redis配置登录密码

    更新记录 2022年6月14日 发布. 打开配置文件 vi /etc/redis/redis.conf 搜索来找到下面这行注释 #requirepass foobared 取消注释,把 foobare ...

  5. .NET Core 企业微信回调配置

    1.配置API接收 2.下载加密解密库 地址:https://developer.work.weixin.qq.com/devtool/introduce?id=36388,也可以复制下面的代码 2. ...

  6. [二进制漏洞]栈(Stack)溢出漏洞 Linux篇

    目录 [二进制漏洞]栈(Stack)溢出漏洞 Linux篇 前言 堆栈 堆栈(Stack)概念 堆栈数据存储方式 函数调用 函数调用C语言代码 函数调用过程GDB调试 函数Call返回原理 函数栈帧 ...

  7. JS:&&运算符

    &&逻辑运算符 当&&连接语句时,两边的语句会转化为布尔类型 1.两边条件都为true时,结果才为true: 2.如果有一个为false,结果就为false: 3.当第 ...

  8. Docker-配置华为云加速

    到网址点击立即使用 https://www.huaweicloud.com/intl/zh-cn/product/swr.html 登录后进入镜像服务 按要求操作即可 相关命令 vi /etc/doc ...

  9. vue-cli在webpack环境下怎样生成开发环境模板(适合初学者)

    1.事先安装好cnpm(淘宝镜像) npm install -g cnpm --registry=https://registry.npm.taobao.org 这是网址,可以自己用命令行工具输入命令 ...

  10. SAP APO-数据集市,信息多维数据集和Dp

    在SAP Advanced Planning and Optimization中,每个数据集市都包含InfoCube,这些InfoCube存储实际数据和较早的计划数据. 在诸如SAP BW之类的数据仓 ...