BZOJ 5293 求和(LCA)
5293: [Bjoi2018]求和
Time Limit: 20 Sec Memory Limit: 512 MB
Submit: 203 Solved: 128
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
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)相关推荐
- BZOJ 3626: [LNOI2014]LCA
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MB Submit: 2074 Solved: 828 [Submit][Stat ...
- bzoj 3626: [LNOI2014]LCA(离线差分+树链剖分)
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MB Submit: 2885 Solved: 1133 [Submit][Sta ...
- 有关多项式处理的各种算法总结
有关多项式处理的各种算法总结 有关多项式处理的各种算法总结 前言 1.一些定义的简要介绍 2.牛顿迭代 3.多项式求逆 4.多项式求lnln\ln 5.多项式开方 6.多项式求指数函数(exp) 7. ...
- BZOJ 2144 跳跳棋(神仙建模题,倍增 LCA,二分)【BZOJ修复工程】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2144 是 hydro 的 BZOJ ...
- LCA+差分【p4427】[BJOI2018]求和
Description master 对树上的求和非常感兴趣.他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的\(k\) 次方和,而且每次的\(k\) 可能是不同的.此处节点深度的 ...
- BZOJ 4734 UOJ #269 如何优雅地求和 (多项式)
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4734 (UOJ) http://uoj.ac/problem/269 题解 ...
- BZOJ 4734 UOJ #269 [清华集训2016]如何优雅地求和 (多项式)
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4734 (UOJ) http://uoj.ac/problem/269 题解 ...
- BZOJ 4555 Luogu P4091 [HEOI2016/TJOI2016]求和 (第二类斯特林数)
题目链接 (lugou) https://www.luogu.org/problem/P4091 (bzoj) https://www.lydsy.com/JudgeOnline/problem.ph ...
- BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MB Submit: 1388 Solved: 860 [Submit][Stat ...
最新文章
- [Head First设计模式]山西面馆中的设计模式——装饰者模式
- qt designer 自定义插件找不到指定的模块_SpringBoot之spring-boot-load模块
- 用scikit-learn进行LDA降维(转载+注释)
- 【转】概要设计说明书
- mysql my.cnf 配置_MySQL——my.cnf参数设置说明
- 4位格雷码的顺序编码_能通俗地讲解一下格雷码的编码规则吗?
- 命名集 —— 名字结构
- js获取当前日期时间和其他操作
- 蓝桥杯2015年第六届javaB组省赛第一题-三角形面积
- 秩为1的矩阵的性质总结
- css -- 背景图片自适应屏幕大小
- 3624用计算机怎么换算,pa与mpa的换算(压力单位pa与mpa)
- linux下批量查找文件内容
- 2021 苟且活着,2022 向上生长
- 如何用AI快速绘制大鼠模型及相关技术路线图,超详细教程!
- Matlab绘制Sigmod、Tanh、ReLU
- nlp-with-transformers系列-02-从头构建文本分类器
- winrar分卷压缩和解压
- 一份实用的seo整体优化方案
- 汉语言文学专业c学校,自考汉语言文学专业哪个学校好?