博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BJOI2018]求和
阅读量:4453 次
发布时间:2019-06-07

本文共 1101 字,大约阅读时间需要 3 分钟。

题目:洛谷P4427。

题目大意:

一棵树,根节点1深度为0。设点i的深度为\(d_i\)。
现在有m个询问,每个询问选择2个点x,y,并给出k。问x到y路径上\(\sum d_i ^k\)。
解题思路:
由于k最大50,我们预处理出k等于1~50的所有节点的树上差分,然后LCA即可。

C++ Code:

#include
#define N 300005#define md 998244353#define LoveLive long longint n,head[N],cnt=0,k;LoveLive dep[51][N],s[51][N];int p[N][22];inline int readint(){ int c=getchar(),d=0; for(;!isdigit(c);c=getchar()); for(;isdigit(c);c=getchar()) d=(d<<3)+(d<<1)+(c^'0'); return d;}struct edge{ int to,nxt;}e[N<<1];void dfs(int now){ for(int i=head[now];i;i=e[i].nxt) if(!~dep[1][e[i].to]){ p[e[i].to][0]=now; dep[1][e[i].to]=dep[1][now]+1; dfs(e[i].to); }}void ssum(int now){ for(int i=head[now];i;i=e[i].nxt) if(dep[1][e[i].to]==dep[1][now]+1){ s[k][e[i].to]=(s[k][now]+dep[k][e[i].to])%md; ssum(e[i].to); }}int lca(int x,int y){ if(dep[1][x]
=0;--i) if(dep[1][p[x][i]]>=dep[1][y])x=p[x][i]; if(x==y)return x; for(int i=21;i>=0;--i) if(p[x][i]&&p[x][i]!=p[y][i])x=p[x][i],y=p[y][i]; return p[x][0];}int main(){ n=readint(); memset(head,0,sizeof head); for(int i=1;i

 

转载于:https://www.cnblogs.com/Mrsrz/p/9163985.html

你可能感兴趣的文章
Codeforces Round #426 (Div. 2) (A B C)
查看>>
The Most Simple Introduction to Hypothesis Testing
查看>>
UVA10791
查看>>
P2664 树上游戏
查看>>
jQuery 停止动画
查看>>
Sharepoint Solution Gallery Active Solution时激活按钮灰色不可用的解决方法
查看>>
MyBatis Generator去掉生成的注解
查看>>
教你50招提升ASP.NET性能(二十二):利用.NET 4.5异步结构
查看>>
lua连续随机数
查看>>
checkstyle使用介绍
查看>>
history.js 一个无刷新就可改变浏览器栏地址的插件(不依赖jquery)
查看>>
会了这十种Python优雅的写法,让你工作效率翻十倍,一人顶十人用!
查看>>
二维码图片生成
查看>>
在做操作系统实验的一些疑问
查看>>
Log4J日志配置详解
查看>>
NameNode 与 SecondaryNameNode 的工作机制
查看>>
Code obfuscation
查看>>
大厂资深面试官 带你破解Android高级面试
查看>>
node.js系列(实例):原生node.js实现接收前台post请求提交数据
查看>>
SignalR主动通知订阅者示例
查看>>