Description

master 对树上的求和非常感兴趣。他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的\(k\) 次方和,而且每次的\(k\) 可能是不同的。此处节点深度的定义是这个节点到根的路径上的边数。他把这个问题交给了pupil,但pupil 并不会这么复杂的操作,你能帮他解决吗?

Input

第一行包含一个正整数\(n\),表示树的节点数。

之后\(n-1\) 行每行两个空格隔开的正整数\(i,j\),表示树上的一条连接点\(i\) 和点\(j\)的边。

之后一行一个正整数\(m\),表示询问的数量。

之后每行三个空格隔开的正整数\(i, j, k\),表示询问从点\(i\)到点\(j\) 的路径上所有节点深度的\(k\) 次方和。由于这个结果可能非常大,输出其对\(998244353\) 取模的结果。

树的节点从\(1\) 开始标号,其中\(1\) 号节点为树的根。

Output

对于每组数据输出一行一个正整数表示取模后的结果。

wa了好多次,结果发现括号匹配错了QAQ。

很明显,这题可以预处理出来\(gw[u][i]\)代表从\(1\)到\(u\)路径上点的深度的\(i\)次方的和.(这是一个前缀和.

然后在\(DFS\)的时候预处理出来倍增数组和\(gw\)数组即可.

预处理\(gw\)数组
\[ gw[u][i]=gw[fa][i]+ksm(depth[u],i) \]
然后根据差分
\[ gw[x][i]+gw[y][i]-(gw[lca_{x,y}][i]+gw[father[lca_{x,y}]][i]) \]
求出\(x,y\)之间的答案即可.

后面的括号写错了,难受得一逼.QAQ

代码

#include<cstdio>
#include<algorithm>
#include<cctype>
#define mod 998244353
#define int long long
#define N 300008
#define R register
using namespace std;
inline void in(int &x)
{int f=1;x=0;char s=getchar();while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}while(isdigit(s)){x=x*10+s-'0';s=getchar();}x*=f;
}
int n,head[N],tot;
struct cod{int u,v;}edge[N<<2];
inline void add(int x,int y)
{edge[++tot].u=head[x];edge[tot].v=y;head[x]=tot;
}
int depth[N],f[N][21],gw[N][53];
int q;
inline int ksm(int x,int y)
{R int res=1;for(;y;y>>=1,x=x%mod*x%mod)if(y&1)res=res%mod*x%mod;return res;
}
void dfs(int u,int fa)
{f[u][0]=fa;depth[u]=depth[fa]+1;for(R int i=1;(1<<i)<=depth[u];i++)f[u][i]=f[f[u][i-1]][i-1];for(R int i=1;i<=52;i++)gw[u][i]=gw[fa][i]+ksm(depth[u],i);for(R int i=head[u];i;i=edge[i].u){if(edge[i].v==fa)continue;dfs(edge[i].v,u);}
}
inline int lca(int x,int y)
{if(depth[x]>depth[y])swap(x,y);for(R int i=20;i>=0;i--)if(depth[x]+(1<<i)<=depth[y])y=f[y][i];if(x==y)return x;for(R int i=20;i>=0;i--){if(f[x][i]==f[y][i])continue;x=f[x][i],y=f[y][i];}return f[x][0];
}
signed main()
{in(n);for(R int i=1,x,y;i<n;i++)in(x),in(y),add(x,y);depth[1]=-1;dfs(1,1);in(q);for(R int i=1,x,y,k;i<=q;i++){in(x),in(y),in(k);R int la=lca(x,y);printf("%lld\n",(((gw[x][k]+gw[y][k])%mod-(gw[la][k]+gw[f[la][0]][k])%mod)+mod)%mod);}
}

转载于:https://www.cnblogs.com/-guz/p/9843502.html

LCA+差分【p4427】[BJOI2018]求和相关推荐

  1. BZOJ 4719--天天爱跑步(LCA差分)

    4719: [Noip2016]天天爱跑步 Time Limit: 40 Sec  Memory Limit: 512 MB Submit: 1464  Solved: 490 [Submit][St ...

  2. BZOJ 5293 求和(LCA)

    5293: [Bjoi2018]求和 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 203  Solved: 128 [Submit][Status ...

  3. 洛谷3258 松鼠的新家

    题目大意 按给定顺序遍历一棵n个节点的树,求每个节点经过的次数.(2≤n≤3×1052\le n \le3\times10^52≤n≤3×105) 知识储备 树上差分: 首先回顾差分.差分就是将区间的 ...

  4. BJOI 2018 题解

    [BJOI2018]求和 可以预处理每一个 k 的答案,树上差分减一下即可 [BJOI2018]治疗之雨 单独写:传送门 [BJOI2018]链上二次求和 枚举 l e n len len, a n ...

  5. 树状数组的区间修改+查询

    首先看树状数组是用来求前缀和比较方便的一种数据结构 sum[i] = Sigma a[i] =Sum(bit[x]) 而区间修改也不难实现 就是引入一个差分数组del del[i]表示对i~n的修改 ...

  6. lp3676 小清新数据结构题

    传送门 Description 有一棵\(n\)个点的树,每个点有一个点权. 现在有\(q\)次操作,每次操作是修改一个点的点权或指定一个点,询问以这个点为根时每棵子树点权和的平方和. Solutio ...

  7. 2017.3.9 Harry and Christmas tree 失败总结

    这题乍一看很想树上莫队.也很像树形dp,也感觉要用树链剖分,树上差分 但又好像不大对-- 莫队的话.单点查询就和暴力无异..    树形dp状态冗杂.     链剖lca多个点不好差分.. 链剖+se ...

  8. noip2016的研究

    noip2016很多创新题,有幸搞到了TA的ak程序,来研究一下. 第一题: toy 可以看到   ^ 异或  有很大作用,当然这个题不卡. 对于环的问题可以从0开始,防止出界和负数可以统一   (a ...

  9. 第三章 系统的时域分析

    线性时不变系统描述 连续系统: 连续系统由线性常系数微分方程描述 特性: 输入为x(t),输出y(t) 则,输入为x(t)的线性变化,积分,微分时,输出也对应的变化. 离散系统: 一般使用 线性常系数 ...

最新文章

  1. PyTorch 数据并行处理
  2. 异常检测概念、异常检测的思路、孤立森林Isolation Forest、​​​​​​​局部异常因子LOF、OneClassSVM、EllipticEnvelop
  3. 云计算安全威胁集中营
  4. jdbc连接数据库失败,com.microsoft.sqlserver.jdbc.SQLServerException: 到主机 的 TCP/IP 连接失败。
  5. PyQt5 官方文档
  6. Schnorr身份识别方案
  7. Seay源代码审计系统2.1源码
  8. 【软考软件评测师】2011年下案例分析历年真题
  9. 液晶显示器背光测试软件,液晶屏背光灯驱动板故障检测方法_维修技术
  10. WPS国外版更改语言设置mac
  11. 月饼(python)
  12. 数字视网膜图像血管分割
  13. [PAT] PAT注意点
  14. 各种浏览器兼容性报告大全
  15. 超全的iOS面试题汇总
  16. 如何区分奋斗者和奋斗b?
  17. 称球问题解析(1)- 12球
  18. 仿58同城的伪静态写法
  19. 南京工资个税计算机,2017南京工资交税标准及个税起征点
  20. 哈希计划(河南省多校联盟第六次)

热门文章

  1. WebHook 与jenkins
  2. 前端优秀博客网站收集
  3. 初学 Delphi 嵌入汇编[12] - 在汇编代码中可以直接使用 Result
  4. 解耦HTML、CSS和JavaScript
  5. 让XP恢复文件权限功能
  6. AI and logistics Patent
  7. intimidated
  8. https://www.unimelb.edu.au/
  9. 纪念一下我画的第一个印刷电路板!
  10. 怎么做逆向geocoding?