【bzoj3786】星系探索
ETT模版题。
真正的Eular-Tour-Tree维护的是树的欧拉序。
由于各种原因,没人知道怎么维护欧拉序,所以我写的是个假的,维护dfs序的。
本质还是用Splay维护序列。
然后因为我常数太差,压着线跑过去的……
#include<bits/stdc++.h>
#define N 100010
using namespace std;
typedef long long ll;
const int M=;
int n,m,a[M];
struct Edge{int u,v,next;}G[M];
int head[M],tot=,tpos[M],rt;
inline void addedge(int u,int v){
G[++tot].u=u;G[tot].v=v;G[tot].next=head[u];head[u]=tot;
G[++tot].u=v;G[tot].v=u;G[tot].next=head[v];head[v]=tot;
}
int size[M],c[M][],val[M],addv[M],fa[M],w[M],s[M],top;
ll sumv[M];
inline void pushup(int x){
size[x]=size[c[x][]]+size[c[x][]]+w[x];
sumv[x]=sumv[c[x][]]+sumv[c[x][]]+w[x]*val[x];
}
inline void puttag(int x,ll v){val[x]+=v;addv[x]+=v;sumv[x]+=v*size[x];}
inline void pushdown(int x){
if(!addv[x])return ;
if(c[x][])puttag(c[x][],addv[x]);
if(c[x][])puttag(c[x][],addv[x]);
addv[x]=;
}
inline void rotate(int x,int &k){
int y=fa[x],z=fa[y],l,r;
if(c[y][]==x)l=;else l=;r=l^;
if(y==k)k=x;else{if(c[z][]==y)c[z][]=x;else c[z][]=x;}
fa[x]=z;fa[y]=x;fa[c[x][r]]=y;
c[y][l]=c[x][r];c[x][r]=y;
pushup(y);pushup(x);
}
inline void splay(int x,int &k){
s[top=]=x;for(int i=x;i!=rt;i=fa[i])s[++top]=fa[i];
for(int i=top;i;--i)pushdown(s[i]);
while(x!=k){
int y=fa[x],z=fa[y];
if(y!=k)
if(c[z][]==y^c[y][]==x)rotate(x,k);
else rotate(y,k);
rotate(x,k);
}
}
inline void ins(int x,int v,int ww){
if(!rt)rt=x;else fa[x]=rt,c[rt][]=x;
val[x]=v;w[x]=ww;pushup(x);splay(x,rt);
}
inline int tmax(int x){while(c[x][])x=c[x][];return x;}
inline int tmin(int x){while(c[x][])x=c[x][];return x;}
inline ll query(int x){
splay(x,rt);return sumv[c[x][]]+1LL*w[x]*val[x];
}
inline void change(int x,int y){
splay(x,rt);int t1=tmax(c[rt][]);
splay(x+N,rt);int t2=tmin(c[rt][]);
splay(t1,rt);splay(t2,c[t1][]);
int z=c[t2][];fa[z]=c[t2][]=;
splay(y,rt);int t3=tmin(c[y][]);
splay(t3,c[y][]);fa[z]=t3;c[t3][]=z;
}
inline void add(int x,int v){
splay(x,rt);int t1=tmax(c[rt][]);
splay(x+N,rt);int t2=tmin(c[rt][]);
splay(t1,rt);splay(t2,c[t1][]);
puttag(c[t2][],v);
}
void build(int u,int f){
ins(u+,a[u],);
for(int i=head[u];i;i=G[i].next){
int v=G[i].v;if(v==f)continue;
build(v,u);
}
ins(u+N+,a[u],-);
}
int main(){
n=io.read();
for(int i=;i<=n;i++){int u=io.read();addedge(u,i);}
for(int i=;i<=n;i++)a[i]=io.read();
ins(,,);build(,);ins(N*+,,);
m=io.read();char s[];
while(m--){
scanf("%s",s);
if(s[]=='Q'){int x=read();printf("%lld\n",query(x+));}
if(s[]=='C'){int x=read(),y=read();change(x+,y+);}
if(s[]=='F'){int x=read(),y=read();add(x+,y);}
}
return ;
}
【bzoj3786】星系探索的更多相关文章
- [BZOJ3786]星系探索
[BZOJ3786]星系探索 试题描述 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个 ...
- BZOJ3786 星系探索 【Splay维护dfs序】*
BZOJ3786 星系探索 Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均 ...
- [BZOJ3786]星系探索(伪ETT)
3786: 星系探索 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1638 Solved: 506[Submit][Status][Discuss ...
- [BZOJ3786] 星系探索(括号序列+Splay)
3786: 星系探索 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 2191 Solved: 644[Submit][Status][Discuss ...
- bzoj3786星系探索 splay
3786: 星系探索 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1314 Solved: 425[Submit][Status][Discuss ...
- BZOJ3786星系探索——非旋转treap(平衡树动态维护dfs序)
题目描述 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球没有依赖星球. ...
- BZOJ3786:星系探索(Splay,括号序)
Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球 ...
- bzoj3786星系探索(splay维护dfs序)
Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球 ...
- BZOJ3786: 星系探索 Splay+DFS序
题目大意:给你一个树,支持三种操作,子树加,点到根的路径和,改变某一个点的父亲. 分析: 看起来像一个大LCT,但是很显然,LCT做子树加我不太会啊... 那么,考虑更换一个点的父亲这个操作很有意思, ...
- BZOJ3786: 星系探索(伪ETT)
题面 传送门 题解 坑啊--我好像把\(Splay\)的东西全忘光了-- \(ETT\)(\(Euler\ Tour\ Tree\))是一种可以资瓷比\(LCT\)更多功能的数据结构,然而不管是功能还 ...
随机推荐
- poj 1273 && hdu 1532 Drainage Ditches (网络最大流)
Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 53640 Accepted: 2044 ...
- Select-poll-epoll-简介
1. Python的select()方法直接调用操作系统的IO接口,它监控sockets,open files, and pipes(所有带fileno()方法的文件句柄)何时变成readable 和 ...
- 洛谷4643:【模板】动态dp——题解
https://www.luogu.org/problemnew/show/P4643 很妙……让我重新又看了一遍猫锟的WC课件. 推荐一个有markdown神犇题解:https://www.cnbl ...
- HDOJ(HDU).2044-2049 递推专题
HDOJ(HDU).2044-2049 递推专题 点我挑战题目 HDU.2044 题意分析 先考虑递推关系:从1到第n个格子的时候由多少种走法? 如图,当n为下方格子的时候,由于只能向右走,所以有2中 ...
- 阅读android源码了解 android 加载so的流程
参考原文:http://bbs.pediy.com/thread-217656.htm Android安全–linker加载so流程,在.init下断点: http://www.blogfshare. ...
- Codeforces Round #514 (Div. 2) C. Sequence Transformation(递归)
C. Sequence Transformation 题目链接:https://codeforces.com/contest/1059/problem/C 题意: 现在有1~n共n个数,然后执行下面操 ...
- sgu 131 状压DP
棋盘覆盖(二) 时间限制:1000 ms | 内存限制:65535 KB 描述 The banquet hall of Computer Scientists' Palace has a ...
- 南阳ACM 题目811:变态最大值 Java版
变态最大值 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 Yougth讲课的时候考察了一下求三个数最大值这个问题,没想到大家掌握的这么烂,幸好在他的帮助下大家算是解决了 ...
- Android 之 Spinner 键值对的绑定(转)
很多时候我们会在下拉菜单中绑定一个值,但是 Spinner本身不提供这样的服务 于是在网上找了N久,终于找到一个简单易用的方案;废话不多说,直接上菜了 首先要定义一个Item类,有以下要注意的: ...
- intellij idea 中添加maven远程仓库
在intellij idea 中配置好maven后 是这样的 如果加载失败,则需要自定义远程仓库,这里以阿里maven仓库为例, 在项目的pom文件中添加以下配置 <repositories&g ...