BZOJ 5507: [gzoi2019]旧词 LCT
时间:2019-11-29
本文章向大家介绍BZOJ 5507: [gzoi2019]旧词 LCT,主要包括BZOJ 5507: [gzoi2019]旧词 LCT使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
和之前那个 【LNOI】LCA 几乎是同一道题,就是用动态树来维护查分就行.
code:
#include <bits/stdc++.h> using namespace std; #define N 50006 #define mod 998244353 #define ll long long #define lson t[x].ch[0] #define rson t[x].ch[1] #define get(x) (t[t[x].f].ch[1]==x) #define isrt(x) (!(t[t[x].f].ch[0]==x||t[t[x].f].ch[1]==x)) #define setIO(s) freopen(s".in","r",stdin) int sta[N],hd[N],to[N],nex[N],answer[N],dep[N],n,Q,K,edges; inline void add(int u,int v) { nex[++edges]=hd[u],hd[u]=edges,to[edges]=v; } inline int qpow(int x,int y) { int tmp=1; for(;y;y>>=1,x=(ll)x*x%mod) if(y&1) tmp=(ll)tmp*x%mod; return tmp; } struct sol { int y,id; sol(int y=0,int id=0):y(y),id(id){} }; vector<sol>a[N]; struct node { int f,rev,ch[2],add; ll sum1,sum2,val1,val2; }t[N]; inline void pushup(int x) { t[x].sum1=(t[lson].sum1+t[rson].sum1+t[x].val1)%mod; t[x].sum2=(t[lson].sum2+t[rson].sum2+t[x].val2)%mod; } inline void rotate(int x) { int old=t[x].f,fold=t[old].f,which=get(x); if(!isrt(old)) t[fold].ch[t[fold].ch[1]==old]=x; t[old].ch[which]=t[x].ch[which^1],t[t[old].ch[which]].f=old; t[x].ch[which^1]=old,t[old].f=x,t[x].f=fold; pushup(old),pushup(x); } inline void mark(int x,int d) { (t[x].val2+=1ll*d*t[x].val1%mod)%=mod; (t[x].sum2+=1ll*d*t[x].sum1%mod)%=mod; t[x].add+=d; } inline void pushdown(int x) { if(x&&t[x].add) { if(lson) mark(lson,t[x].add); if(rson) mark(rson,t[x].add); t[x].add=0; } } void splay(int x) { int v=0,u=x,fa; for(sta[++v]=u;!isrt(u);u=t[u].f) sta[++v]=t[u].f; for(;v;--v) pushdown(sta[v]); for(u=t[u].f;(fa=t[x].f)!=u;rotate(x)) { if(t[fa].f!=u) { rotate(get(fa)==get(x)?fa:x); } } } void Access(int x) { for(int y=0;x;y=x,x=t[x].f) { splay(x); rson=y; pushup(x); } } void dfs(int u) { dep[u]=dep[t[u].f]+1; t[u].val1=(qpow(dep[u],K)-qpow(dep[u]-1,K)+mod)%mod; for(int i=hd[u];i;i=nex[i]) dfs(to[i]); pushup(u); } int main() { // setIO("input"); int i,j; scanf("%d%d%d",&n,&Q,&K); for(i=2;i<=n;++i) { scanf("%d",&t[i].f),add(t[i].f,i); } dep[1]=1,dfs(1); for(i=1;i<=Q;++i) { int x,y; scanf("%d%d",&x,&y); a[x].push_back(sol(y,i)); } for(i=1;i<=n;++i) { Access(i),splay(i),mark(i,1); for(j=0;j<a[i].size();++j) { Access(a[i][j].y),splay(a[i][j].y); answer[a[i][j].id]=t[a[i][j].y].sum2%mod; } } for(i=1;i<=Q;++i) printf("%d\n",answer[i]); return 0; }
原文地址:https://www.cnblogs.com/guangheli/p/11956283.html
- 手把手带你进入TOP20的商超销售预测
- 【干货荟萃】机器学习&深度学习知识资料大全集(二)(论文/教程/代码/书籍/数据/课程等)
- 逆天通用水印扩展篇~新增剪贴板系列的功能和手动配置,卸除原基础不常用的功能
- 【专知-Java Deeplearning4j深度学习教程06】用卷积神经网络CNN进行图像分类
- 万恶的剪贴板==》为存储而生
- AdaBoost算法(R语言)
- CTF---Web入门第六题 因缺思汀的绕过
- 小案例(六):预测小偷行为(python)
- 小案例(五):销量预测(python)
- SQL:插入指定标识列的数据时候的小错误
- 逻辑回归与梯度下降详解
- 决策树(R语言)
- ExecuteReader在执行有输出参数的存储过程时拿不到输出参数
- CTF---Web入门第十三题 拐弯抹角
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python 利用OpenCV给照片换底色
- Python爬虫实战 批量下载高清美女图片
- Python matplotlib数据可视化 绘制柱形图、堆叠图、折线图、饼图和环图
- Python Matplotlib数据可视化 绘制箱形图、散点图和直方图
- 【Lighthouse教程】scrapy爬虫初探
- Python爬虫 爬取B站视频弹幕 + 绘制词云
- Python爬虫学习笔记 asyncio+aiohttp 异步爬虫原理和解析
- Python数据分析 利用NetworkX绘制网络图
- Python爬虫练习 爬取网络小说保存到txt
- Python爬取链家成都二手房源信息 asyncio + aiohttp 异步爬虫实战
- Python matplotlib数据可视化 subplot绘制多个子图
- python pathlib模块的基本使用和总结
- Python 爬取前程无忧最新招聘数据 matplotlib数据分析与可视化
- Python opencv图像处理基础总结(一)
- Python opencv图像处理基础总结(二) ROI操作与泛洪填充 模糊操作 边缘保留滤波EPF