传送门

一遍AC,开心!

$Link-Cut-Tree$最后一题

//BZOJ 1180
//by Cydiater
//2016.9.18
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <ctime>
#include <cmath>
#include <iomanip>
#include <cstdlib>
using namespace std;
#define ll long long
#define up(i,j,n)        for(int i=j;i<=n;i++)
#define down(i,j,n)        for(int i=j;i>=n;i--)
const int MAXN=1e6+5;
const int oo=0x3f3f3f3f;
inline int read(){
    char ch=getchar();int x=0,f=1;
    while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int N,q[MAXN],top=0,M,nodea,nodeb,node,v;
char op[15];
struct Tree{
    int son[2],v,sum,tag,fa;
}t[MAXN];
namespace solution{
    inline bool get(int node){return t[t[node].fa].son[1]==node;}
    inline bool isroot(int node){return t[t[node].fa].son[0]!=node&&t[t[node].fa].son[1]!=node;}
    inline bool updata(int node){
        if(node){
            t[node].sum=t[node].v;
            if(t[node].son[0])t[node].sum+=t[t[node].son[0]].sum;
            if(t[node].son[1])t[node].sum+=t[t[node].son[1]].sum;
        }
    }
    inline void downit(int node){
        if(t[node].tag){
            t[t[node].son[0]].tag^=1;t[t[node].son[1]].tag^=1;
            swap(t[node].son[0],t[node].son[1]);
            t[node].tag^=1;
        }
    }
    inline void rotate(int node){
        int old=t[node].fa,oldf=t[old].fa,which=get(node);
        if(!isroot(old))t[oldf].son[t[oldf].son[1]==old]=node;
        t[old].son[which]=t[node].son[which^1];t[t[old].son[which]].fa=old;
        t[node].son[which^1]=old;t[node].fa=oldf;t[old].fa=node;
        updata(old);updata(node);
    }
    inline void splay(int node){
        top=0;q[++top]=node;
        for(int i=node;!isroot(i);i=t[i].fa)q[++top]=t[i].fa;
        down(i,top,1)downit(q[i]);
        while(!isroot(node)){
            int old=t[node].fa,oldf=t[old].fa;
            if(!isroot(old))rotate(get(node)==get(old)?old:node);
            rotate(node);
        }
    }
    inline void access(int node){
        int tmp=0;
        while(node){
            splay(node);t[node].son[1]=tmp;
            updata(node);tmp=node;
            node=t[node].fa;
        }
    }
    inline void Reverse(int node){
        access(node);splay(node);t[node].tag^=1;
    }
    inline void Link(int noda,int nodb){
        Reverse(noda);t[noda].fa=nodb;
    }
    inline void Cut(int noda,int nodb){
        Reverse(noda);access(nodb);splay(nodb);
        t[nodb].son[0]=t[noda].fa=0;
    }
    inline int find(int node){
        access(node);splay(node);
        while(t[node].son[0])node=t[node].son[0];
        return node;
    }
    inline void LCA(int noda,int nodb){
        Reverse(nodb);access(noda);splay(noda);
    }
    inline void change(int node,int v){
        access(node);
        splay(node);
        t[node].v=v;updata(node);
    }
    void init(){
        N=read();
        up(i,1,N){
            t[i].v=t[i].sum=read();
            t[i].son[0]=t[i].son[1]=t[i].fa=0;
        }
    }
    void slove(){
        M=read();
        while(M--){
            scanf("%s",op);
            if(op[0]=='b'){
                nodea=read();nodeb=read();
                if(find(nodea)==find(nodeb))puts("no");
                else{
                    puts("yes");
                    Link(nodea,nodeb);
                }
            }
            if(op[0]=='p'){
                node=read();v=read();
                change(node,v);
            }
            if(op[0]=='e'){
                nodea=read();nodeb=read();
                if(find(nodea)==find(nodeb)){
                    LCA(nodea,nodeb);
                    printf("%d\n",t[nodea].sum);
                }
                else puts("impossible");
            }
        }
    }
}
int main(){
    //freopen("input.in","r",stdin);
    using namespace solution;
    init();
    slove();
    return 0;
}

BZOJ1180: [CROATIAN2009]OTOCI的更多相关文章

  1. BZOJ1180 [CROATIAN2009]OTOCI LCT

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1180 本题和BZOJ2843一样. BZOJ2843 极地旅行社 LCT 题意概括 有n座岛 每座 ...

  2. BZOJ2843极地旅行社&BZOJ1180[CROATIAN2009]OTOCI——LCT

    题目描述 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作:  1.bridge A B:询问结点A与结点B是否连通. 如果是则输出“no”.否则输出“yes”,并且在 ...

  3. BZOJ1180 [CROATIAN2009]OTOCI 【LCT】

    题目 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作: 1.bridge A B:询问结点A与结点B是否连通.如果是则输出"no".否则输出&qu ...

  4. [bzoj1180][CROATIAN2009]OTOCI_LCT

    OTOCI bzoj-1180 CROATIAN-2009 题目大意:给你n个离散的点,m个操作.支持:两点加边(保证还是森林),修改单点权值,询问两点是否联通,查询联通两点之间路径权值. 注释:$1 ...

  5. BZOJ 1180: [CROATIAN2009]OTOCI [LCT]

    1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 961  Solved: 594[Submit][S ...

  6. BZOJ 1180: [CROATIAN2009]OTOCI

    1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 989  Solved: 611[Submit][S ...

  7. 1180: [CROATIAN2009]OTOCI(LCT)

    1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 1200  Solved: 747[Submit][ ...

  8. 1180: [CROATIAN2009]OTOCI

    1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 1032  Solved: 638[Submit][ ...

  9. 【BZOJ1180】: [CROATIAN2009]OTOCI & 2843: 极地旅行社 LCT

    竟然卡了我....忘记在push_down先下传父亲的信息了....还有splay里for():卡了我10min,但是双倍经验还是挺爽的,什么都不用改. 感觉做的全是模板题,太水啦,不能这么水了... ...

随机推荐

  1. Windows 部署 Redis 群集

    1,下载Redis for windows 的最新版本,解压到 c:\Redis 目录下备用https://github.com/MSOpenTech/redis/releases当前我使用的是 3. ...

  2. JS 页面加载触发事件 document.ready和window.onload的区别

    document.ready和onload的区别——JavaScript文档加载完成事件页面加载完成有两种事件: 一是ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件): 二是onlo ...

  3. 用SpringMvc实现Excel导出功能

    以前只知道用poi导出Excel,最近用了SpringMvc的Excel导出功能,结合jxl和poi实现,的确比只用Poi好,两种实现方式如下: 一.结合jxl实现: 1.引入jxl的所需jar包: ...

  4. Java Little Knowledge

    1.Constructor running order of Base class and Derived class This is Alibaba's audition problem. clas ...

  5. Java--剑指offer(8)

    36.输入两个链表,找出它们的第一个公共结点. 解题思路:这里主要是把两个链表的节点都放入两个栈中,这样就可以按照出栈的方式来比较节点,因为单链表只要是有相同的节点,那么之后的节点也都是一样的,所以如 ...

  6. Android studio配置Git

    Android studio配置Git 1.下载window 版git并安装:下载地址 2.Android Studio设置git插件:File->Setting->Version Con ...

  7. Ibatis的环境搭建以及遇到的问题解决

    新建Java项目IbatisTest,加入Mysql和ibatis的驱动包; 在数据库中新建一张表student表,添加字段sid.sname.major.birth; 在java项目中添加bean对 ...

  8. mysql union和union all的区别

    union 对两个结果集进行并集操作,重复数据只显示一次 Union All,对两个结果集进行并集操作,重复数据全部显示 工具/原料 mysql 数据库 方法/步骤   student表数据   使用 ...

  9. Android怎么使用字体图标 自定义FontTextView字体图标控件-- 使用方法

    首先我想说明一下字体图标的好处,最大的好处就是自适应了,而且是使用TextView 不用去切图,是矢量图 灵活调用 第一步我要说明一下一般字体图标的来源,我这里使用的是  --阿里巴巴矢量图标库 -网 ...

  10. Java设计模式(五) 工厂模式

    1,定义抽象产品类 package com.pattern.factory; import java.util.ArrayList; public abstract class Pizza { Str ...