BZOJ5293:[BJOI2018]求和(LCA,差分)
Description
Input
Output
Sample Input
1 2
1 3
2 4
2 5
2
1 4 5
5 4 45
Sample Output
503245989
说明
样例解释
以下用d(i) 表示第i 个节点的深度。
对于样例中的树,有d(1)=0,d(2)=1,d(3)=1,d(4)=2,d(5)=2。
因此第一个询问答案为(2^5 + 1^5 + 0^5) mod 998244353 = 33
第二个询问答案为(2^45 + 1^45 + 2^45) mod 998244353 = 503245989。
Solution
对于这个题,如果不考虑k次方的话就是裸的树上差分
然后发现k非常小,就可以把所有k次方的情况全部记录下来
全WA到取模和longlong上了……
Code
#include<iostream>
#include<cstring>
#include<cstdio>
#define MOD (998244353)
#define N (300000+100)
using namespace std; struct node
{
int to,next;
}edge[N*];
int Father[N],a[N],Depth[N],f[N][],Sum[N][],Pow[N][];
int head[N],num_edge,n,m,x,y,k; void add(int u,int v)
{
edge[++num_edge].to=v;
edge[num_edge].next=head[u];
head[u]=num_edge;
} void Build(int x)
{
Depth[x]=Depth[Father[x]]+;
Sum[x][]=; Pow[x][]=;
for (int i=; i<=; ++i)
{
Pow[x][i]=((long long)Pow[x][i-]*(long long)Depth[x])%MOD;
Sum[x][i]=(Sum[Father[x]][i]+Pow[x][i])%MOD;
} for (int i=head[x]; i; i=edge[i].next)
if (edge[i].to!=Father[x])
{
Father[edge[i].to]=x;
f[edge[i].to][]=x;
Build(edge[i].to);
}
} int LCA(int x,int y)
{
int ans=;
if (Depth[x]<Depth[y]) swap(x,y);
for (int i=; i>=; --i)
if (Depth[f[x][i]]>=Depth[y])
x=f[x][i];
if (x==y) return x;
for (int i=; i>=; --i)
if (f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
return Father[x];
} int main()
{
scanf("%d",&n);
for (int i=; i<=n-; ++i)
{
scanf("%d%d",&x,&y);
add(x,y); add(y,x);
}
Depth[]=-;
Build();
for (int i=; i<=; ++i)
for (int j=;j<=n;++j)
f[j][i]=f[f[j][i-]][i-];
scanf("%d",&m);
for (int i=; i<=m; ++i)
{
scanf("%d%d%d",&x,&y,&k);
int lca=LCA(x,y);
printf("%d\n",((Sum[x][k]+Sum[y][k]-Sum[Father[lca]][k]-Sum[lca][k])%MOD+MOD)%MOD);
}
}
BZOJ5293:[BJOI2018]求和(LCA,差分)的更多相关文章
- BZOJ5293: [Bjoi2018]求和 树上差分
Description master 对树上的求和非常感兴趣.他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的k 次方和,而且每次的k 可能是不同的.此处节点深度的定义是这个节点 ...
- bzoj5293: [Bjoi2018]求和
题目链接 bzoj5293: [Bjoi2018]求和 题解 暴力 对于lca为1的好坑啊.... 代码 #include<cmath> #include<cstdio> #i ...
- [BZOJ5293][BJOI2018]求和(倍增)
裸的树上倍增. #include<cstdio> #include<cstring> #include<algorithm> #define rep(i,l,r) ...
- 【BZOJ5293】[BJOI2018]求和(前缀和,LCA)
[BZOJ5293][BJOI2018]求和(前缀和,LCA) 题面 BZOJ 洛谷 题解 送分题??? 预处理一下\(k\)次方的前缀和. 然后求个\(LCA\)就做完了?... #include& ...
- P4427 [BJOI2018]求和
P4427 [BJOI2018]求和 同[TJOI2018]教科书般的扭曲虚空 懒得写了(雾 #include<bits/stdc++.h> #define il inline #defi ...
- NOIP2015 运输计划(二分+LCA+差分)
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 308 Solved: 208[Submit][Status] ...
- LCA+差分【p4427】[BJOI2018]求和
Description master 对树上的求和非常感兴趣.他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的\(k\) 次方和,而且每次的\(k\) 可能是不同的.此处节点深度的 ...
- Luogu4427 [BJOI2018]求和 (树上差分)
预处理,树上差分.注意深度减一 #include <cstdio> #include <iostream> #include <cstring> #include ...
- 【刷题】BZOJ 5293 [Bjoi2018]求和
Description master 对树上的求和非常感兴趣.他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的k 次方和,而且每次的k 可能是不同的.此处节点深度的定义是这个节点到 ...
随机推荐
- 44个 Javascript 变态题解析
原题来自: http://javascript-puzzlers.herokuapp.com/ 读者可以先去做一下感受感受. 当初笔者的成绩是 21/44... 当初笔者做这套题的时候不仅怀疑智商, ...
- js密码强度校验
function AuthPasswd(string) { if(!string){ jQuery("#low").removeClass("org"); }) ...
- JS 中的require 和 import 区别整理
ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是CommonJS规范,使用require引入模块,使 ...
- 快速删除node_modules目录
当node项目需要重新安装依赖,并且需要删除原有的node_modules目录时,windows下删除该目录比较麻烦的,所以我就在网上找了个npm包,名字叫做 rimraf 安装步骤: npm ins ...
- Go.网络篇-2
package main import ( "io/ioutil" "os" "io" "log" "net/ ...
- C# WCF服务入门
之前在公司用的服务端是wcf写的,但是没有深入研究,最近找工作,面试的时候好多人看到这个总提问,这里做个复习 就用微软官方上的例子,搭一个简单的wcf服务,分6步 1 定义服务协定也就是契约,其实就是 ...
- flask 简易注册登陆
db.py import MySQLdb conn = MySQLdb.connect(', 'test1') cur = conn.cursor() def addUser (username,pa ...
- js中的this--执行上下文
条件:函数调用的时候 才有执行上下文 this 不同情况的调用,this也不同 1)当函数直接打点调用,此时的this 是window 2)事件触发函数,此时的this是触发这个事件的对象 3)当对 ...
- 准备Activiti开发环境
1.添加jar包 在activiti-5.13 -> wars 目录下 解压 activiti-rest.war ,导入WEB-INF\lib下所有包添加到classpath中. 由于使用的是O ...
- Apache Phoenix on CDH 5
We are happy to announce the inclusion of Apache Phoenix in Cloudera Labs. [Update: A new package fo ...