• [luogu]P4312 [COCI 2009] OTOCI / 极地旅行社(LCT)


    P4312 [COCI 2009] OTOCI / 极地旅行社

    题目描述

    不久之前,Mirko建立了一个旅行社,名叫“极地之梦”。这家旅行社在北极附近购买了N座冰岛,并且提供观光服务。

    当地最受欢迎的当然是帝企鹅了,这些小家伙经常成群结队的游走在各个冰岛之间。Mirko的旅行社遭受一次重大打击,以至于观光游轮已经不划算了。旅行社将在冰岛之间建造大桥,并用观光巴士来运载游客。

    Mirko希望开发一个电脑程序来管理这些大桥的建造过程,以免有不可预料的错误发生。这些冰岛从1到N标号。一开始时这些岛屿没有大桥连接,并且所有岛上的帝企鹅数量都是知道的。每座岛上的企鹅数量虽然会有所改变,但是始终在[0, 1000]之间。你的程序需要处理以下三种命令:

    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个操作,要求在线处理所有操作。

    输入输出格式

    输入格式:

    第一行包含一个整数n(1<=n<=30000),表示节点的数目。

    第二行包含n个整数,第i个整数表示第i个节点初始时对应的权值。

    第三行包含一个整数q(1<=n<=300000),表示操作的数目。

    以下q行,每行包含一个操作,操作的类别见题目描述。

    任意时刻每个节点对应的权值都是1到1000的整数。

    输出格式:

    输出所有bridge操作和excursion操作对应的输出,每个一行。

    输入输出样例

    输入样例#1: 复制

    5
    4 2 4 5 6
    10
    excursion 1 1
    excursion 1 2
    bridge 1 2
    excursion 1 2
    bridge 3 4
    bridge 3 5
    excursion 4 5
    bridge 1 3
    excursion 2 4
    excursion 2 5

    输出样例#1: 复制

    4
    impossible
    yes
    6
    yes
    yes
    15
    yes
    15
    16

    说明

    数据范围:1<=n<=30000, 1<=q<=300000, 0<=wi<=1000。


    题解

    几个月没打lct了,打道模板练练手
    看看操作吧。
    1.只要link就可以了。注意yes和no的鬼畜输出。
    2.先access当前点,然后splay当前点,最后push一下修改值就可以了。因为access以后当前点是深度最深的点。splay以后它就不属于除它自己以外的子树了,这个时候改它自己的值就可以了。
    3.先判是否联通,是则提出这条边的和。
    所以这是怎么在luogu上评了黑的?


    代码

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    const int N=1e6+5;
    struct node{
        int v,ff,ch[2];
        int rev,s;
    }t[N];
    int n,m,ch[N],S[N],top;
    int read(){
        int x=0,w=1;char ch=getchar();
        while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
        return x*w;
    }
    
    bool isroot(int x){
        return t[t[x].ff].ch[1]!=x&&t[t[x].ff].ch[0]!=x;
    }
    
    void pushup(int x){
        t[x].s=t[t[x].ch[0]].s+t[t[x].ch[1]].s+t[x].v;
    }
    
    void pushdown(int x){
        if(t[x].rev){
            swap(t[x].ch[1],t[x].ch[0]);
            t[t[x].ch[1]].rev^=1;
            t[t[x].ch[0]].rev^=1;
            t[x].rev=0;
        }
    }
    
    void rotate(int x){
        int y=t[x].ff,z=t[y].ff,k=t[y].ch[1]==x;
        if(!isroot(y))t[z].ch[t[z].ch[1]==y]=x;t[x].ff=z;
        t[y].ch[k]=t[x].ch[k^1];t[t[x].ch[k^1]].ff=y;
        t[y].ff=x;t[x].ch[k^1]=y;
        pushup(y);pushup(x);
    }
    
    void splay(int x){
        S[top=1]=x;
        for(int i=x;!isroot(i);i=t[i].ff)S[++top]=t[i].ff;
        for(int i=top;i;i--)pushdown(S[i]);
        while(!isroot(x)){
            int y=t[x].ff,z=t[y].ff;
            if(!isroot(y))
            (t[y].ch[0]==x)^(t[z].ch[0]==y)?rotate(x):rotate(y);
            rotate(x);
        }
    }
    
    void access(int x){for(int y=0;x;y=x,x=t[x].ff)splay(x),t[x].ch[1]=y,pushup(x);}
    void makeroot(int x){access(x);splay(x);t[x].rev^=1;}
    int findroot(int x){access(x);splay(x);while(t[x].ch[0])x=t[x].ch[0];return x;}
    void spilt(int x,int y){makeroot(x);access(y);splay(y);}
    void link(int x,int y){makeroot(x);t[x].ff=y;}
    
    int main(){
        n=read();
        for(int i=1;i<=n;i++)ch[i]=t[i].v=read();
        m=read();
        while(m--){
            char opt[11];
            scanf("%s",opt);
            if(opt[0]=='e'){
                int x=read(),y=read();
                if(findroot(x)!=findroot(y))printf("impossible
    ");
                else spilt(x,y),printf("%d
    ",t[y].s);
            }
            if(opt[0]=='p'){
                int x=read(),y=read();;
                access(x);splay(x);t[x].v=y;pushup(x);
            }
            if(opt[0]=='b'){
             	int x=read(),y=read();
                if(findroot(x)==findroot(y))printf("no
    ");
                else printf("yes
    "),link(x,y);
            }
        }
        return 0;
    }
    
  • 相关阅读:
    结对练习(能力有限,待解决......)
    骰子修改
    骰子传奇
    现在的辛苦一点,会是将来的更好一点!
    入坑?那就从坑里爬出来
    性能测试工具locust简单应用
    阿里云环境部署
    Charles的安装与抓取手机包设置
    windows常用命令-netstat
    采坑小记——adb链接夜神模拟器
  • 原文地址:https://www.cnblogs.com/hhh1109/p/9709246.html
Copyright © 2020-2023  润新知