题面

传送门

题解

坑啊……我好像把\(Splay\)的东西全忘光了……

\(ETT\)(\(Euler\ Tour\ Tree\))是一种可以资瓷比\(LCT\)更多功能的数据结构,然而不管是功能还是复杂度都远远比不上\(TopTree\)和\(LCT\)(然而我似乎连\(TopTree\)都不会……)

然而一般情况下我们需要用到的只有伪\(ETT\),用人话说就是用\(Splay\)维护欧拉序,进栈的时候值为\(+v\),出栈的时候值为\(-v\),那么\(1\)到\(u\)的路径上的所有数之和就是\(dfs\)序上\(ls[1]\)到\(ls[u]\)的所有数之和了(虽然看别的大佬的博客说这东西资瓷查询任意两点间路径和……然而咱并不明白该怎么搞……如果有知道的可以在下面告诉咱一声么qwq)

换根操作的话,就相当于提出一个区间放到另一个地方,\(Splay\)一下就好了

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=E[i].v;i;i=E[i].nx,v=E[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){R int res,f=1;R char ch;while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');return res*f;
}
inline char getop(){R char ch;while((ch=getc())>'Z'||ch<'A');return ch;}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R ll x){if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;while(z[++Z]=x%10+48,x/=10);while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=2e5+5;
struct eg{int v,nx;}E[N];int head[N],tot;
inline void add(R int u,R int v){E[++tot]={v,head[u]},head[u]=tot;}
struct node;typedef node* ptr;
struct node{ptr fa,lc,rc;int sz,ty;ll sum,t,v;inline node();inline void init(R int x,R int s){sz=ty=s,v=sum=x;}inline void ppd(R ll x){sum+=x*sz,v+=x*ty,t+=x;}inline void pd(){if(t)lc->ppd(t),rc->ppd(t),t=0;}inline ptr upd(){sum=lc->sum+rc->sum+v,sz=lc->sz+rc->sz+ty;return this;}
}e[N],*rt;
inline node::node(){lc=rc=fa=e;}
void push(ptr rt,ptr p){if(p!=rt)push(rt,p->fa);p->pd();}
void rotate(ptr &rt,ptr p){ptr s=p->fa,t=s->fa;if(s!=rt)(t->lc==s?t->lc:t->rc)=p;else rt=p;p->fa=t,s->fa=p;if(s->lc==p)s->lc=p->rc,p->rc->fa=s,p->rc=s->upd();else s->rc=p->lc,p->lc->fa=s,p->lc=s->upd();
}
ptr splay(ptr &rt,ptr p){push(rt,p);while(p!=rt){if(p->fa!=rt)rotate(rt,p->fa->lc==p^p->fa->fa->lc==p->fa?p:p->fa);rotate(rt,p);}return p->upd();
}
inline ptr lst(ptr p){p=splay(rt,p)->lc;while(p->rc!=e)p=p->rc;return p;}
inline ptr nxt(ptr p){p=splay(rt,p)->rc;while(p->lc!=e)p=p->lc;return p;}
inline ptr split(ptr s,ptr t){s=lst(s),t=nxt(t),splay(rt,s);return splay(s->rc,t);}
int a[N],val[N],ls[N],rs[N],tim;
void dfs(int u){ls[u]=++tim,val[tim]=u;go(u)dfs(v);rs[u]=++tim,val[tim]=-u;
}
void build(ptr &p,int l,int r,ptr fa){int mid=(l+r)>>1;p=e+mid,p->fa=fa;val[mid]>0?p->init(a[val[mid]],1):p->init(-a[-val[mid]],-1);if(l<mid)build(p->lc,l,mid-1,p);if(mid<r)build(p->rc,mid+1,r,p);p->upd();
}
inline ll get(R int x){return split(e+ls[1],e+ls[x])->lc->sum;}
void move(int x,int y){ptr s=split(e+ls[x],e+rs[x]),t=s->lc;s->lc=t->fa=e,s->upd(),s->fa->upd();splay(rt,e+ls[y]),s=splay(rt->rc,nxt(rt));s->lc=t,t->fa=s,s->upd(),s->fa->upd();
}
void tag(int x,int y){split(e+ls[x],e+rs[x])->lc->ppd(y);}
int n,m;
int main(){
//  freopen("testdata.in","r",stdin);n=read();for(R int i=2,x;i<=n;++i)x=read(),add(x,i);fp(i,1,n)a[i]=read();tim=1,dfs(1),build(rt,1,tim+1,e);m=read();char op;int x,y;while(m--){op=getop(),x=read();switch(op){case 'Q':print(get(x));break;case 'C':y=read(),move(x,y);break;case 'F':y=read(),tag(x,y);break;}}return Ot(),0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10715071.html

BZOJ3786: 星系探索(伪ETT)相关推荐

  1. [BZOJ3786]星系探索

    星系探索 题解 一道ETT板子题 笔者最开始用FHQ_Treap打的ETT,忘记可以沿 f a fa fa算出它的欧拉序,一直没调出来,于是就改用splay了. ETT的模板.其实我觉得叫它平衡树板子 ...

  2. bzoj3786星系探索 splay

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

  3. bzoj3786: 星系探索

    学到了新姿势,splay维护括号序列(听说是伪ETT(euler-tour-tree 欧拉搜索树)?) 大型工业题 注意点:1:结构改变了以后编号变成不连续的了,要找前驱和后继 2:就算lazy也需要 ...

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

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

  5. BZOJ#3786. 星系探索(平衡树,fhq-treap,弱化版ETT)

    BZOJ#3786. 星系探索 Solution 子树加,换fatherfatherfather(保证还是树),询问到根路径和. 树上路径求和不好动态维护,于是转化到序列上,维护一个括号序,dfndf ...

  6. BZOJ 3729: Gty的游戏 [伪ETT 博弈论]【学习笔记】

    题意: 给定一棵有根树,每个节点有一些石子,每次可以将不多于k的石子移动到父节点 修改一个点的石子数,插入一个点,询问某棵子树是否先手必胜 显然是一个阶梯Nim 每次最多取k个,找规律或者观察式子易发 ...

  7. android探索宇宙app,AR研学星系探索app

    AR研学星系探索app是一款为喜欢探索宇宙的用户们提供的关于八大行星学习的软件:通过VR虚拟的形式让用户可以更加直观地了解到我们的地球和我们的浩瀚的宇宙,来启发用户对宇宙的探索和好奇.这款软件会为用户 ...

  8. BZOJ3786 星际探索

    @(BZOJ)[DFS序, Splay] Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其 ...

  9. BZOJ3729: Gty的游戏(伪ETT)

    题面 传送门 前置芝士 巴什博奕 \(Nim\)游戏的改版,我们现在每次最多只能取走\(k\)个石子,那么\(SG\)函数很容易写出来 \[SG(x)=mex_{i=1}^{\min(x,k)}SG( ...

  10. [BZOJ 3786] 星系探索

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

最新文章

  1. 《评人工智能如何走向新阶段》后记(再续5)
  2. gdb php-fpm,使用 gdb 调试 php-fpm 异常错误
  3. linux install命令文件夹,详解Linux系统中的install命令的用法
  4. docker选择安装位置_监控摄像机的安装位置选择和焦距选择
  5. 企业邮箱服务器删除邮件,企业邮箱Webmail对邮件进行删除或者清空邮件的方法...
  6. EF 6 code first - 从SQL server迁移到MySQL
  7. pytorch中的torch.rand(),torch.randn(),torch.randerm()的关系
  8. 使用逻辑回归制作评分卡
  9. hdu 4681(枚举+dp)
  10. html元素中的click属性,从HTML中的onClick属性调用jQuery方法
  11. eclipse安装反编译工具
  12. 线程编程(thread programming)介绍
  13. 主流搜索引擎博客提交地址
  14. mac book usb 故障修复
  15. 计算机字节与位的换算,计算机字节换算(计算机字节换算器)
  16. matlab线性拟合最大偏差值,algorithm – matlab:线性拟合的最佳点数
  17. 阵列卡u盘安装系统步骤_带Raid的服务器安装系统(采用U盘安装)
  18. 简单盘点游戏开发引擎
  19. 微信公众号运营的七大问题,你遇到了吗?
  20. 油漆算法问题_不同类型的油漆(以及何时使用它们)

热门文章

  1. 3D模型欣赏:美杜莎女妖 角色设计完整 造型独特
  2. 计算反转录转座子插入时间二:提取成对LTRs序列
  3. thinpad E43系列WIN8装WIN7系统
  4. 在iOS微信里如何自动播放
  5. 基于STM32的0.96寸OLED显示屏显示数据
  6. 内积空间中向量正交的定义
  7. jupyter 阿里云服务器配置 远程连接 开机自动启动服务
  8. CF 1538 G. Gift Set (贪心+思维)
  9. 在线培训-虚拟演播室嵌入网页直播
  10. pathogen插件管理器学习笔记