bzoj 1180: [CROATIAN2009]OTOCI

http://www.lydsy.com/JudgeOnline/problem.php?id=1180

大约又是个裸的lct,开始re了好久后来发现建了重边

#include<cstdio>
#include<iostream>
const int maxn =60007;
int n,m;
int top=0;
int ch[maxn][2],fa[maxn],stack[maxn];
int ans[maxn],v[maxn];
bool rev[maxn];
inline int read() {
    int x=0;
    char c=getchar();
    while(c<‘0‘||c>‘9‘) c=getchar();
    while(c<=‘9‘&&c>=‘0‘) x=x*10+c-‘0‘,c=getchar();
    return x;
}
void update(int x) {
    ans[x]=ans[ch[x][1]]+ans[ch[x][0]]+v[x];
}
bool isroot(int x) {
    return ch[fa[x]][1]!=x&&ch[fa[x]][0]!=x;
}
void pushdown(int x) {
    if(rev[x]) {
        rev[x]^=1;
        rev[ch[x][0]]^=1;rev[ch[x][1]]^=1;std::swap(ch[x][1],ch[x][0]);
    }
}
void rotate(int x) {
    int y=fa[x],z=fa[y],d=(ch[y][1]==x)^1;
    if(!isroot(y)) ch[z][ch[z][1]==y]=x;
    fa[x]=z;
    ch[y][d^1]=ch[x][d],fa[ch[x][d]]=y;
    ch[x][d]=y;fa[y]=x;
    update(y);update(x);
}
void splay(int x) {
    stack[++top]=x;
    for(int i=x;!isroot(i);i=fa[i]) stack[++top]=fa[i];
    while(top)pushdown(stack[top--]);
    while(!isroot(x)) {
        int y=fa[x],z=fa[y];
        if(!isroot(y)) {
            if(ch[y][1]==x^ch[z][1]==y)rotate(x);
            else rotate(y);
        }
        rotate(x);
    }
    return ;
}
void access(int x) {
    for(int i=0;x;i=x,x=fa[x]) {
        splay(x);
        ch[x][1]=i;update(x);
    }
}
void makeroot(int x) {
    access(x),splay(x);rev[x]^=1;
}
void link(int x,int y) {
    makeroot(x),fa[x]=y;return splay(x);
}
int find(int x) {
    for(access(x),splay(x);ch[x][0];x=ch[x][0]) ;
    return x;
}
void split(int x,int y) {
    makeroot(x),access(y);
    return splay(y);
}
int query(int x,int y) {
    split(x,y);return ans[y];
}
void modify(int x,int y) {
    access(x),splay(x),v[x]=y;
    return update(x);
}
int main() {
    n=read();
    for(int i=1;i<=n;++i) {
        v[i]=read();ans[i]=v[i];
    }
    m=read();
    char c[70];
    for(int a,b;m;m--) {
        scanf("%s",c),a=read(),b=read();
        if(c[0]==‘b‘) {
            if(find(a)==find(b))puts("no");
            else puts("yes"),link(a,b);
        }
        else if(c[0]==‘p‘) {
            modify(a,b);
        }
        else {
            if(find(a)!=find(b))puts("impossible");
            else printf("%d\n",query(a,b));
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/sssy/p/8150642.html

时间: 2024-10-17 20:55:08

bzoj 1180: [CROATIAN2009]OTOCI的相关文章

BZOJ 1180: [CROATIAN2009]OTOCI [LCT]

1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 961  Solved: 594[Submit][Status][Discuss] Description 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作: 1.bridge A B:询问结点A与结点B是否连通.如果是则输出“no”.否则输出“yes”,并且在结点A和结点B之间连一条无向边. 2.penguins A

1180: [CROATIAN2009]OTOCI(LCT)

1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 1200  Solved: 747[Submit][Status][Discuss] Description 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作: 1.bridge A B:询问结点A与结点B是否连通.如果是则输出“no”.否则输出“yes”,并且在结点A和结点B之间连一条无向边. 2.penguins

【BZOJ】1180: [CROATIAN2009]OTOCI(lct)

http://www.lydsy.com/JudgeOnline/problem.php?id=1180 今天状态怎么这么不好....................................... 又是调了好久........................................... 我竟然忘记更改值那里要先makeroot后再更改,而且还要pushup先!!!!! QAQ 太弱了.. 记住!!!更改信息一定要先变成了根再修改,而且还要pushup! #include <cs

OTOCI(bzoj 1180)

Description 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作: 1.bridge A B:询问结点A与结点B是否连通.如果是则输出"no".否则输出"yes",并且在结点A和结点B之间连一条无向边. 2.penguins A X:将结点A对应的权值wA修改为X. 3.excursion A B:如果结点A和结点B不连通,则输出"impossible".否则输出结点A到结点B的路径上的点对应的权值的和.给

BZOJ 1180 CROATIAN 2009 OTOCI/2843 极地旅行社 LCT

题目大意:给出一些初始相互分离的岛,有三个操作,1.分析两点是否联通,如果不连通,在之间连一条边.2.更改一个点的权值.3.询问两点之间路径上所有点的点权和. 思路:基本算是LCT的模板题了吧,好久没写了,基本都要忘了,这是照别人代码写的... CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 30010 using

bzoj1180: [CROATIAN2009]OTOCI

Description 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作: 1.bridge A B:询问结点A与结点B是否连通.如果是则输出"no".否则输出"yes",并且在结点A和结点B之间连一条无向边. 2.penguins A X:将结点A对应的权值wA修改为X. 3.excursion A B:如果结点A和结点B不连通,则输出"impossible".否则输出结点A到结点B的路径上的点对应的权值的和.给

【bzoj1180】[CROATIAN2009]OTOCI LCT

题目描述 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作: 1.bridge A B:询问结点A与结点B是否连通.如果是则输出"no".否则输出"yes",并且在结点A和结点B之间连一条无向边. 2.penguins A X:将结点A对应的权值wA修改为X. 3.excursion A B:如果结点A和结点B不连通,则输出"impossible".否则输出结点A到结点B的路径上的点对应的权值的和.给出q个操作,要

12月刷题总结

各种被屠...学东西各种慢... QAQ 字符串: sam: [SPOJ]7258. Lexicographical Substring Search(后缀自动机) [SPOJ]1812. Longest Common Substring II(后缀自动机) [BZOJ]2555: SubString(后缀自动机) [BZOJ]3172: [Tjoi2013]单词(后缀自动机) [wikioi]3160 最长公共子串(后缀自动机) lcp: [BZOJ]1014: [JSOI2008]火星人pr

bzoj1180,2843

1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 967  Solved: 597[Submit][Status][Discuss] Description 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作: 1.bridge A B:询问结点A与结点B是否连通.如果是则输出"no".否则输出"yes",并且在结点A和结点B之间连一条无向