博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Codeforces757G]Can Bash Save the Day?——动态点分治(可持久化点分树)
阅读量:6299 次
发布时间:2019-06-22

本文共 1698 字,大约阅读时间需要 5 分钟。

题目链接:

 题目大意:给出一棵n个点的树及一个1~n的排列pi,边有边权,有q次操作:

1 l r x 求 $\sum\limits_{i=l}^{r}dis(p_{i},x)$

2 x $swap(p_{x},p_{x+1})$

$n,q<=2*10^5$,强制在线

如果多次询问一个点到所有点的距离和,我们可以点分树解决,在点分树上每个点x维护点分树上x子树中的所有点到x的距离和及所有点到x父节点的距离和,每次询问往根爬容斥一下求和即可。如果没有修改操作我们依旧可以每个点对pi建线段树来区间求和,但有了修改操作在修改时时间复杂度会爆炸。我们依据可持久化线段树区间查询的原理也可以对点分树进行可持久化,按照pi的顺序每个版本往点分树中插入一个点的信息,建出对应的一条链并将链上点没建出的子节点连向上一个版本的对应节点,每个点同样维护上述两个信息,但如果直接连接可能一个点会有许多儿子,这样时间复杂度就不对了,因此我们将多叉树转二叉树(具体操作详见),这样一个点的出边最多只有三个,点分树上的子节点数也就最多只有三个。具体的可持久化点分树插入和查询操作参见。因为可持久化点分树每个版本相当于保存了一个前缀和,所以查询时直接用r版本的答案减l-1版本的答案即可。对于修改操作,可以发现实际需要修改的就只要x这个版本,那么我们重建x版本的点分树即可。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long#define pr pair
using namespace std;ll z;ll ans;int op;int cnt;int tot;int x,y;int l,r;int dfn;int rot;int num;int n,m,q;ll d[400010];int a[200010];int p[400010];int val[800010];int to[800010];int lg[800010];int mx[400010];int dep[400010];int vis[400010];int size[400010];int nxt[800010];int head[400010];int g[800010][20];int root[200010];vector
v[200010];vector
pre[400010];struct miku{ int son[3]; int res; int lty; ll sum; ll fsum;}s[12000010];void add(int x,int y,ll z){ tot++; nxt[tot]=head[x]; head[x]=tot; to[tot]=y; val[tot]=z;}void rebuild(int x,int fa){ int len=v[x].size(); int last=0; int tmp=0; for(int i=0;i
>1]+1; } for(int j=1;j<=19;j++) { for(int i=1;i+(1<
<=dfn;i++) { g[i][j]=mn(g[i][j-1],g[i+(1<<(j-1))][j-1]); } }}ll lca(int x,int y){ x=p[x],y=p[y]; if(x>y) { swap(x,y); } int len=lg[y-x+1]; return mn(g[x][len],g[y-(1<

转载于:https://www.cnblogs.com/Khada-Jhin/p/10175454.html

你可能感兴趣的文章
创建第一个vue实例
查看>>
记录下最近写前端的一些小技巧
查看>>
Java SE 第十六讲----面向对象特征之继承
查看>>
《你的灯亮着吗》阅读笔记1
查看>>
浅谈Asp.net的sessionState
查看>>
演练:创建和注册自定义 HTTP 模块
查看>>
C#将DataTable转换成list的方法
查看>>
NIO
查看>>
你不来,我不敢老去
查看>>
第二篇 Mysql常用操作记录(转载)
查看>>
c语言中fflush的运用为什么没有效果呢,测试平台linux
查看>>
架构师实践日 11.9 南京站报名 | 技术大牛带你剖析大数据平台内部演进中的挑战与实践...
查看>>
BusinessObject Port 配置
查看>>
异常和函数
查看>>
软工实验三
查看>>
学习OpenCV(一)从Mat讲起
查看>>
BZOJ 2535:NOI 2010 航空管制
查看>>
linux下的C语言开发
查看>>
62. 不同路径
查看>>
C++程序员学Python:C与Python进行交互
查看>>