一个叫 Euler-Tour-Tree 的数据结构,说白了就是用 Splay_Tree 维护欧拉序

#include <cstring>
#include <algorithm>
#include <string>
#include <cstdio>

using namespace std;

void setIO(string a){
    freopen((a+".in").c_str(),"r",stdin);
    freopen((a+".out").c_str(),"w",stdout);
}

#define maxn 300000
#define ll long long

int euler[maxn], w[maxn], cnt=1;
int head[maxn],to[maxn],nex[maxn],edges,root;
ll sumv[maxn], val[maxn], lazy[maxn];
void addedge(int u,int v){
    nex[++edges]=head[u],head[u]=edges,to[edges]=v;
}

void dfs(int u){
    euler[++cnt]=u*2, val[u*2]=w[u];
    for(int v=head[u];v;v=nex[v])
        dfs(to[v]);
    euler[++cnt]=u*2+1, val[u*2+1]=-w[u];
}

struct Splay_Tree{

    int f[maxn],ch[maxn][2],sta[maxn],siz[maxn];
    int rson(int x)
    {
        return ch[x][1];
    }

    int lson(int x)
    {
        return ch[x][0];
    }

    int get(int x)
    {
        return ch[f[x]][1]==x;
    }

    void update(int x,int c)
    {
        val[x]+=(x%2==0?1:-1)*c;
        lazy[x]+=c;
        sumv[x]+=siz[x]*c;
    }

    void pushup(int x)
    {
        sumv[x]=sumv[lson(x)]+sumv[rson(x)]+val[x];
        siz[x]=siz[lson(x)]+siz[rson(x)];
        siz[x]+=(x>=200099 ? 0: (x%2==0?1:-1));
    }

    void pushdown(int x)
    {
        if(lazy[x]) update(lson(x),lazy[x]), update(rson(x),lazy[x]),lazy[x]=0;
    }   

    int pre(int x)
    {
        splay(x,root);
        x=lson(root);
        while(rson(x)) x=rson(x);
        return x;
    }

    int las(int x)
    {
        splay(x,root);
        x=rson(root);
        while(lson(x)) x=lson(x);
        return x;
    }

    void build(int l,int r,int &o,int fa)
    {
        if(l>r)return;
        int mid=(l+r)>>1;
        o=euler[mid], f[o]=fa;
        build(l,mid-1,ch[o][0],o);
        build(mid+1,r,ch[o][1],o);
        pushup(o);
    }

    void rotate(int x)
    {
        int old=f[x], oldf=f[old], which=get(x);
        ch[old][which]=ch[x][which^1], f[ch[old][which]]=old;
        ch[x][which^1]=old,f[old]=x,f[x]=oldf;
        if(oldf) ch[oldf][ch[oldf][1]==old]=x;
        pushup(old),pushup(x);
    }

    void splay(int x,int &tar)
    {
        int v=0,u=x,a=f[tar];
        while(u!=a) sta[++v]=u,u=f[u];
        while(v) pushdown(sta[v--]);
        for(int fa;(fa=f[x])!=a;rotate(x))
            if(f[fa]!=a) rotate(get(fa)==get(x)?fa:x);
        tar=x;
    }

    void opt1(int a)
    {
        int x=las(a*2);
        splay(200100,root),splay(x,ch[root][1]);
        printf("%lld\n",sumv[ch[ch[root][1]][0]]);
    }

    void opt2(int a,int b)
    {
        int x=pre(a*2),y=las(a*2+1),tmp;
        splay(x,root),splay(y,ch[root][1]);
        tmp=ch[ch[root][1]][0], ch[ch[root][1]][0]=f[tmp]=0;
        pushup(ch[root][1]), pushup(root);

        x=las(b*2);
        splay(b*2,root), splay(x,ch[root][1]);
        ch[ch[root][1]][0]=tmp,f[tmp]=ch[root][1];
        pushup(ch[root][1]),pushup(root);
    }

    void opt3(int a,int b)
    {
        int x=pre(a*2),y=las(a*2+1);
        splay(x,root),splay(y,ch[root][1]);
        update(ch[ch[root][1]][0],b);
        pushup(ch[root][1]),pushup(root);
    }

}tree;

int main(){
    //setIO("input");
    int n,x,m;
    scanf("%d",&n);
    for(int i=2;i<=n;++i)
        scanf("%d",&x),addedge(x,i);
    for(int i=1;i<=n;++i) scanf("%d",&w[i]);

    dfs(1);

    euler[1]=200100, euler[++cnt]=200101;
    tree.build(1,cnt,root,0);

    scanf("%d",&m);

    while(m--)
    {
        char opt[10];
        int a,b;
        scanf("%s",opt);
        if(opt[0]=='Q')
        {
            scanf("%d",&a);
            tree.opt1(a);
        }
        if(opt[0]=='C')
        {
            scanf("%d%d",&a,&b);
            tree.opt2(a,b);
        }
        if(opt[0]=='F')
        {
            scanf("%d%d",&a,&b);
            tree.opt3(a,b);
        }
    }
    return 0;
}

  

BZOJ 3786: 星系探索 欧拉游览树的更多相关文章

  1. 数据结构&图论:欧拉游览树

    ETT可以称为欧拉游览树,它是一种和欧拉序有关的动态树(LCT是解决动态树问题的一种方案,这是另一种) dfs序和欧拉序是把树问题转化到区间问题上然后再用数据结构去维护的利器 通过借助这两种形式能够完 ...

  2. BZOJ 3786: 星系探索 解题报告

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

  3. BZOJ 3786 星系探索

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

  4. BZOJ 3786: 星系探索 [伪ETT]

    传送门 数据,标程 题意: 一颗有根树,支持询问点到根路径权值和,子树加,换父亲 欧拉序列怎么求路径权值和? 一个点的权值只会给自己的子树中的点贡献,入栈权值正出栈权值负,求前缀和就行了! 和上题一样 ...

  5. bzoj 3786 星系探索 dfs+splay

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

  6. BZOJ 3786 星系探索 (splay+dfs序)

    题目大意:给你一棵树,支持一下三种操作 1.获取某节点到根节点的路径上所有节点的权值和 2.更换某棵子树的父亲 3.某子树内所有节点的权值都增加一个值w 当时想到了splay维护dfs序,查完题解发现 ...

  7. BZOJ 3786: 星系探索 ETT

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

  8. BZOJ 3786 星系探索 ——Splay

    子树可以移动,唔. 还是用Splay维护DFS序即可. 子树的话直接截取出来就好了. 然后求前驱后继可能麻烦一些. 添加两个虚拟节点会比较好写. #include <map> #inclu ...

  9. BZOJ 2818 Gcd 线性欧拉

    题意:链接 方法:线性欧拉 解析: 首先列一下表达式 gcd(x,y)=z(z是素数而且x,y<=n). 然后我们能够得到什么呢? gcd(x/z,y/z)=1; 最好还是令y>=x 则能 ...

随机推荐

  1. Pocket英语语法---五、形式主语是怎么回事

    Pocket英语语法---五.形式主语是怎么回事 一.总结 一句话总结:1.to不定式或动名词可以在主语的位置上,但一般用it代替它做形式主语.这种情况it叫形式主语. It's a great ho ...

  2. [JZOJ 5437] [NOIP2017提高A组集训10.31] Sequence 解题报告 (KMP)

    题目链接: http://172.16.0.132/senior/#main/show/5437 题目: 题解: 发现满足上述性质并且仅当A序列的子序列的差分序列与B序列的差分序列相同 于是我们把A变 ...

  3. xBIM 基础13 WeXplorer 设置模型颜色

    系列目录    [已更新最新开发文章,点击查看详细]  默认情况下模型具有合理的图形表示.这是从IFC模型中获取的,它应该在所有工具中看起来相同,它应该与您或您的用户的创作环境中的相同.但有时候能够改 ...

  4. vim编辑器常用语法

    1)yy (功能描述:复制光标当前一行) y数字y (功能描述:复制一段(从第几行到第几行))2)p (功能描述:箭头移动到目的行粘贴)3)u (功能描述:撤销上一步)4)dd (功能描述:删除光标当 ...

  5. SpringMVC(二) 参数绑定 与 JSON

    参数绑定 http请求传输的参数都是String类型,但是Hanlder业务方法中的参数都是我们指定的数据类型,如int,Object等,所以需要处理参数的类型转换.此项工作不需要我们开发人员去完成, ...

  6. QT笔记 -- (2) 文件相关操作、中文路径乱码

    1.显示文件对话框,选择一个目录,显示选中目录中的所有图片的代码如下 主要class: QFileDialog QStringList QFileInfoList QDir void open(){ ...

  7. intellij idea 15 for mac破解版(含注册码)下载

    转载 https://blog.csdn.net/dataiyangu/article/details/81163118

  8. 移动端的vue项目,启动错误:Module build failed: Error: No PostCSS Config found in:

    新建一个postcss.config.js 写上下面代码 `module.exports = { plugins: { 'autoprefixer': {browsers: 'last 5 versi ...

  9. 【BZOJ4444】国旗计划 - 决策单调性

    Description A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名优秀的边 ...

  10. GDOI2018爆炸记

    Day0 12:45p.m. 从初中部出发前回班探望了一下同学,受到热烈欢迎(?) 13:15p.m. 出发去中山,路上本来想用mac看fz的,结果ass字幕导入失败,心态爆炸*1:后来成功获取xfz ...