5293: [Bjoi2018]求和

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 203  Solved: 128
[Submit][Status][Discuss]

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

对于每组数据输出一行一个正整数表示取模后的结果。
1≤n,m≤300000,1≤k≤50

Sample Input

5
1 2
1 3
2 4
2 5
2
1 4 5
5 4 45

Sample Output

33
503245989

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include <queue>
#include <iostream>using namespace std;
typedef long long LL;
#define N 300005
const int mod = 998244353;
int pow(int a,int b){int odd = 1;while (b){if(b&1){odd = (int)(1ll*odd*a%mod);}a = (int)(1ll*a*a%mod);b>>=1;}return odd;
}
class Graphic {
public:Graphic(){bin[0] =1;for(int i = 1 ; i < 25 ; ++i)bin[i] = bin[i-1]<<1;}void init(){cnt = 0;dep[1] = 1;fa[1][0] = 0;memset(head,-1, sizeof(head));}void pre_deal(){dfs(1);cal(1);}void add(int u,int v){_add(u,v);_add(v,u);}int find_sum(int x,int y,int rat){int la = lca(x,y);return int((nx[x][rat]+nx[y][rat]-nx[la][rat]-nx[fa[la][0]][rat])%mod);}
private:struct Edge {int to, next;} edge[N << 1];int head[N],cnt;int bin[25];int dep[N],fa[N][25];///fa[i][j]表示 i的第 (1<<j)个父亲
    LL nx[N][52];///nx[i][j] 表示节点i的j次方和void _add(int u,int v){edge[cnt].to = v;edge[cnt].next = head[u];head[u] = cnt++;}int lca(int x,int y){if(dep[x]<dep[y])swap(x,y);for(int i=20;i>=0;i--)if(bin[i]<=dep[x] and dep[fa[x][i]]>=dep[y])x=fa[x][i];///将x y的深度调成相同的if(x==y)return x;for(int i=20;i>=0;i--)if(bin[i]<=dep[x] and fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];return fa[x][0];}void cal(int x){for(int i = 1 ; i <= 50 ; ++i)nx[x][i] = nx[fa[x][0]][i]+pow(dep[x]-1,i);int v;for(int i = head[x] ; ~i ; i = edge[i].next){v = edge[i].to;if(v!=fa[x][0])cal(v);}}void dfs(int x){for(int i = 1 ; i <= 20 ; ++i){if(fa[x][i-1]){fa[x][i] = fa[fa[x][i-1]][i-1];/// x的第 2^i个父亲就是 x的2^(i-1)个父亲的2^(i-1)个父亲
            }else break;}int v;for(int i = head[x] ; ~i ;i = edge[i].next ){v = edge[i].to;if(v!=fa[x][0]){fa[v][0] = x;dep[v] = dep[x]+1;dfs(v);}}}
};
Graphic ss;
int main(){int n,m,a,b;while(cin>>n){ss.init();for(int i = 1 ; i < n ; ++i){scanf("%d %d",&a,&b);ss.add(a,b);}ss.pre_deal();cin>>m;int k;while (m--){scanf("%d %d %d",&a,&b,&k);printf("%d\n",ss.find_sum(a,b,k));}}
}

转载于:https://www.cnblogs.com/DevilInChina/p/9455013.html

BZOJ 5293 求和(LCA)相关推荐

  1. BZOJ 3626: [LNOI2014]LCA

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2074  Solved: 828 [Submit][Stat ...

  2. bzoj 3626: [LNOI2014]LCA(离线差分+树链剖分)

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2885  Solved: 1133 [Submit][Sta ...

  3. 有关多项式处理的各种算法总结

    有关多项式处理的各种算法总结 有关多项式处理的各种算法总结 前言 1.一些定义的简要介绍 2.牛顿迭代 3.多项式求逆 4.多项式求lnln\ln 5.多项式开方 6.多项式求指数函数(exp) 7. ...

  4. BZOJ 2144 跳跳棋(神仙建模题,倍增 LCA,二分)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2144 是 hydro 的 BZOJ ...

  5. LCA+差分【p4427】[BJOI2018]求和

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

  6. BZOJ 4734 UOJ #269 如何优雅地求和 (多项式)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4734 (UOJ) http://uoj.ac/problem/269 题解 ...

  7. BZOJ 4734 UOJ #269 [清华集训2016]如何优雅地求和 (多项式)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4734 (UOJ) http://uoj.ac/problem/269 题解 ...

  8. BZOJ 4555 Luogu P4091 [HEOI2016/TJOI2016]求和 (第二类斯特林数)

    题目链接 (lugou) https://www.luogu.org/problem/P4091 (bzoj) https://www.lydsy.com/JudgeOnline/problem.ph ...

  9. BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MB Submit: 1388  Solved: 860 [Submit][Stat ...

最新文章

  1. [Head First设计模式]山西面馆中的设计模式——装饰者模式
  2. qt designer 自定义插件找不到指定的模块_SpringBoot之spring-boot-load模块
  3. 用scikit-learn进行LDA降维(转载+注释)
  4. 【转】概要设计说明书
  5. mysql my.cnf 配置_MySQL——my.cnf参数设置说明
  6. 4位格雷码的顺序编码_能通俗地讲解一下格雷码的编码规则吗?
  7. 命名集 —— 名字结构
  8. js获取当前日期时间和其他操作
  9. 蓝桥杯2015年第六届javaB组省赛第一题-三角形面积
  10. 秩为1的矩阵的性质总结
  11. css -- 背景图片自适应屏幕大小
  12. 3624用计算机怎么换算,pa与mpa的换算(压力单位pa与mpa)
  13. linux下批量查找文件内容
  14. 2021 苟且活着,2022 向上生长
  15. 如何用AI快速绘制大鼠模型及相关技术路线图,超详细教程!
  16. Matlab绘制Sigmod、Tanh、ReLU
  17. nlp-with-transformers系列-02-从头构建文本分类器
  18. winrar分卷压缩和解压
  19. 一份实用的seo整体优化方案
  20. 汉语言文学专业c学校,自考汉语言文学专业哪个学校好?

热门文章

  1. 在职研究生(多重继承)
  2. 数据结构的一些基本术语概念-严蔚敏老师
  3. echarts 数据区域缩放
  4. 为图片添加斜体水印并保存水印图片
  5. gitlab密码忘了怎么办?
  6. 乐鑫esp8266学习rtos3.0笔记第9篇:整理分享那些我在项目中常用的esp8266 rtos3.0版本的常见驱动,Button按键长短按、PWM平滑调光等。(附带demo)
  7. 阿里云 ACP 认证,分享下经验心得
  8. Java面试题 Error和Exception有什么区别?列出你见过的Execption并简要说明?
  9. springboot入门
  10. 8Manage:大宗商品采购,专注构建企业采购信息化!