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】星系探索的更多相关文章

  1. [BZOJ3786]星系探索

    [BZOJ3786]星系探索 试题描述 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个 ...

  2. BZOJ3786 星系探索 【Splay维护dfs序】*

    BZOJ3786 星系探索 Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均 ...

  3. [BZOJ3786]星系探索(伪ETT)

    3786: 星系探索 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1638  Solved: 506[Submit][Status][Discuss ...

  4. [BZOJ3786] 星系探索(括号序列+Splay)

    3786: 星系探索 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 2191  Solved: 644[Submit][Status][Discuss ...

  5. bzoj3786星系探索 splay

    3786: 星系探索 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1314  Solved: 425[Submit][Status][Discuss ...

  6. BZOJ3786星系探索——非旋转treap(平衡树动态维护dfs序)

    题目描述 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球没有依赖星球. ...

  7. BZOJ3786:星系探索(Splay,括号序)

    Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球 ...

  8. bzoj3786星系探索(splay维护dfs序)

    Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球 ...

  9. BZOJ3786: 星系探索 Splay+DFS序

    题目大意:给你一个树,支持三种操作,子树加,点到根的路径和,改变某一个点的父亲. 分析: 看起来像一个大LCT,但是很显然,LCT做子树加我不太会啊... 那么,考虑更换一个点的父亲这个操作很有意思, ...

  10. BZOJ3786: 星系探索(伪ETT)

    题面 传送门 题解 坑啊--我好像把\(Splay\)的东西全忘光了-- \(ETT\)(\(Euler\ Tour\ Tree\))是一种可以资瓷比\(LCT\)更多功能的数据结构,然而不管是功能还 ...

随机推荐

  1. 【bzoj2588】Spoj 10628. Count on a tree 离散化+主席树

    题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个 ...

  2. URL 编码规则

    规则: 1.将空格转换为加号(+) 2.对0-9.a-z.A-Z之间的字符保持不变 3.对于所有其他的字符,用这个字符的当前当前字符集编码在内存中的十六进制格式表示,并在每一个字节前加上一个百分号(% ...

  3. 【刷题】BZOJ 1003 [ZJOI2006]物流运输

    Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...

  4. Linux相关——画图软件安装

    其实也不知道算不算Linux相关了... 装个画图软件还是很方便的,刚刚试了一下kolourpaint,感觉还行,就记录下来吧. 先记录几个快捷键emmmm print ---->全屏截图 al ...

  5. BZOJ2301:[HAOI2011]Problem b——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2301 https://www.luogu.org/problemnew/show/P2522 对于给 ...

  6. bzoj1778: [Usaco2010 Hol]Dotp 驱逐猪猡(概率DP+高斯消元)

    深夜肝题...有害身心健康QAQ 设f[i]为到达i的概率,d[i]为i的度数. 因为无限久之后炸弹爆炸的概率是1,所以最后在i点爆炸的概率实际上就是f[i]/sigma(f[]) 列出方程组 f[i ...

  7. Golang命名规范和开发规范

    目录 命名 文件命名 package 变量 常量 接口 结构体 方法 注释 README 命名 文件命名 文件命名一律采用小写,不用驼峰式,尽量见名思义,看见文件名就可以知道这个文件下的大概内容. 其 ...

  8. Javascript基本代码

    简单的了解了javascript 的基本代码,感觉和c#中的语句差不多. <!DOCTYPE html> <html xmlns="http://www.w3.org/19 ...

  9. POJ 3254 状态压缩 DP

    B - Corn Fields Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:65536KB    ...

  10. Linux下实现文档在线浏览

    使用php实现百度文库功能,网上搜索到的方案,实现doc转pdf,pdf转swf,然后显示出来. 这里简单的记录下,[doc转pdf,pdf转swf]两个功能的搭建流程. doc转pdf 使用到下列程 ...