bzoj3786: 星系探索 //ETT
bzoj3786: 星系探索
题意
给出一棵有根树,支持更改父节点、子树加权、询问根到某一点路径上的权值和。
N≤1e5。
题解
Euler Tour Tree的模板。
听jcy讲的时候感觉比LCT简单 于是写了一发 调了两个晚自修…。
ETT是用splay维护这棵树的欧拉序,就是形如”1,2,-2,3,-3,-1”这样的 每个点正编号在第一次访问到时出现,负编号在回溯时出现 的序列(并不会准确描述
子树加就是把那一段子树转出来。
换父亲的话,把整个子树(x和-x中间那一段)平移到-y前面就好。
一个点到根的路径,就是1~x的权值和。
正编号的位置是这个点的权值,负编号的位置是这个点权值的相反数 推标记的时候注意一下
代码
为什么跑得这么慢啊…
#include<bits/stdc++.h>
#define N 200005
using namespace std;
int n,m,cnt,f[N],c[N][2],dfn[N],des[N],
to[N],hd[N],lk[N],val[N],ll[N],rr[N],siz[N];
long long sum[N],a[N],laz[N];
void dfs(int k)
{dfn[ll[k]=++cnt]=k;for(int i=lk[k];i;i=hd[i])dfs(to[i]);dfn[rr[k]=++cnt]=-k;
}
inline void update(int k)
{sum[k]=sum[c[k][0]]+sum[c[k][1]]+a[k];siz[k]=siz[c[k][0]]+siz[c[k][1]]+des[k];
}
int build(int l,int r)
{int mid=l+r>>1;if(l<mid)f[c[mid][0]=build(l,mid-1)]=mid;if(mid<r)f[c[mid][1]=build(mid+1,r)]=mid;a[mid]=dfn[mid]>0?val[dfn[mid]]:-val[-dfn[mid]];des[mid]=dfn[mid]>0?1:-1;update(mid);return mid;
}
inline void add(int k,int v)
{laz[k]+=v,a[k]+=des[k]*v,sum[k]+=(long long)siz[k]*v;}
void pd(int k)
{if(f[k])pd(f[k]);if(laz[k])add(c[k][0],laz[k]),add(c[k][1],laz[k]),laz[k]=0;
}
inline void rotate(int x,bool mode)
{int y=f[x];if(f[y])c[f[y]][c[f[y]][1]==y]=x;f[x]=f[y],f[c[x][mode]]=y;c[y][mode^1]=c[x][mode],c[x][mode]=y,f[y]=x;update(y),update(x);
}
inline void splay(int x,int k)
{pd(x);bool t1,t2;int y;while((y=f[x])^k){t1=c[y][0]==x,t2=c[f[y]][0]==y;if(f[y]==k){rotate(x,t1);return;}(t1^t2)?(rotate(x,t1),rotate(x,t2)):(rotate(y,t2),rotate(x,t1));}
}
inline int findl(int x)
{splay(x,0);x=c[x][0];while(c[x][1])x=c[x][1];return x;
}
inline int findr(int x)
{splay(x,0);x=c[x][1];while(c[x][0])x=c[x][0];return x;
}
char op[2];
int x,y,z,tp;
int main()
{scanf("%d",&n);for(int i=2;i<=n;i++)scanf("%d",&x),to[++cnt]=i,hd[cnt]=lk[x],lk[x]=cnt;cnt=1,dfs(1);for(int i=1;i<=n;i++)scanf("%d",val+i);build(1,cnt+1);scanf("%d",&m);while(m--){scanf("%s%d",op,&x);if(op[0]=='Q'){splay(ll[x],0);printf("%lld\n",sum[c[ll[x]][0]]+a[ll[x]]);}if(op[0]=='C'){tp=findl(ll[x]),z=findr(rr[x]);splay(tp,0),splay(z,tp);y=c[z][0];c[z][0]=0;update(z),update(tp);x=y;scanf("%d",&y);splay(z=findl(rr[y]),0),splay(rr[y],z);f[x]=rr[y],c[rr[y]][0]=x;update(rr[y]),update(z);}if(op[0]=='F'){scanf("%d",&y);tp=findl(ll[x]),z=findr(rr[x]);splay(tp,0),splay(z,tp);add(c[z][0],y);}}
}
bzoj3786: 星系探索 //ETT相关推荐
- [BZOJ3786]星系探索
星系探索 题解 一道ETT板子题 笔者最开始用FHQ_Treap打的ETT,忘记可以沿 f a fa fa算出它的欧拉序,一直没调出来,于是就改用splay了. ETT的模板.其实我觉得叫它平衡树板子 ...
- bzoj3786星系探索 splay
3786: 星系探索 Time Limit: 40 Sec Memory Limit: 256 MB Submit: 1314 Solved: 425 [Submit][Status][Discu ...
- bzoj3786: 星系探索
学到了新姿势,splay维护括号序列(听说是伪ETT(euler-tour-tree 欧拉搜索树)?) 大型工业题 注意点:1:结构改变了以后编号变成不连续的了,要找前驱和后继 2:就算lazy也需要 ...
- bzoj3786星系探索(splay维护dfs序)
Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球 ...
- BZOJ#3786. 星系探索(平衡树,fhq-treap,弱化版ETT)
BZOJ#3786. 星系探索 Solution 子树加,换fatherfatherfather(保证还是树),询问到根路径和. 树上路径求和不好动态维护,于是转化到序列上,维护一个括号序,dfndf ...
- android探索宇宙app,AR研学星系探索app
AR研学星系探索app是一款为喜欢探索宇宙的用户们提供的关于八大行星学习的软件:通过VR虚拟的形式让用户可以更加直观地了解到我们的地球和我们的浩瀚的宇宙,来启发用户对宇宙的探索和好奇.这款软件会为用户 ...
- BZOJ3786 星际探索
@(BZOJ)[DFS序, Splay] Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其 ...
- [BZOJ 3786] 星系探索
BZOJ传送门 题目描述 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有 n n n个星球,其中有一个主星球(方便起见我们默认其为 1 1 1号星球),其余的所有星球均有且仅 ...
- BZOJ 3786: 星系探索 欧拉游览树
一个叫 Euler-Tour-Tree 的数据结构,说白了就是用 Splay_Tree 维护欧拉序 #include <cstring> #include <algorithm> ...
- bzoj3786 星际探索 splay dfs序
这道题 首先 因为他求的是当前点到根节点的路径和 我们可以将题目转换为括号序列的写法 将点拆为左括号以及右括号 左括号为正 右括号为负 这样题目就变为了求前缀和了 如果一个点是这个点的子树 那么他的左 ...
最新文章
- PHP随机字符串生成器
- SAP Cloud for Customer interaction center 呼叫中心集成
- Spring MVC 4快速入门Maven原型得到了改进–更多Java 8功能
- 分离整数的各个数(信息学奥赛一本通-T1088)
- 用nodejs搭建一个简单的服务器
- [转]我们都是花栗鼠
- 短命的 CentOS 8 将停止维护
- c#ref和out的相同点_C#中ref和out的使用小结
- VC++的菜单控制和自绘菜单
- 深入理解java:2.3.4. 并发编程concurrent包 之容器ConcurrentLinkedQueue(非阻塞的并发队列---循环CAS)...
- (转)券商IT研发现状:一年最多花5亿 中小公司靠外包
- JavaSE 编写第一个程序
- 物联网之感知-分布式光纤传感-应用前景分析
- 问题:虚拟机安装Ubuntu时,显示PXE-MOF:Exiting Intel PXE ROM.Operating Systen not found
- 机器视觉培训教程-硬件选型
- Verilog学习之路(1)— Quartus II 13.0下载安装和HelloWorld
- 初识组件--全局注册\局部注册
- SmartFoxServer 2X管理工具
- R语言使用lm函数构建简单线性回归模型(建立线性回归模型)、拟合回归直线、使用attributes函数查看线性回归模型的属性信息、获取模型拟合对应的残差值residuals
- 《Total Commander:万能文件管理器》——第7.3节.总结与作业