BZOJ 1455: 罗马游戏

Posted 北屿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 1455: 罗马游戏相关的知识,希望对你有一定的参考价值。

Description

支持合并和求最小值。

Solution

可并堆-左偏树。

前几天随便看了一下...感觉也挺好写的...

Code

/**************************************************************
    Problem: 1455
    User: BeiYu
    Language: C++
    Result: Accepted
    Time:1628 ms
    Memory:24728 kb
****************************************************************/
 
#include <bits/stdc++.h>
using namespace std;
 
const int N = 1000050;
 
inline int in(int x=0,char ch=getchar()) { while(ch>‘9‘ || ch<‘0‘) ch=getchar();
    while(ch>=‘0‘ && ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar();return x; }
 
int n,m;
int A[N],D[N],L[N],R[N],f[N];
int b[N];
 
int find(int x) { return f[x]==x?x:f[x]=find(f[x]); }
int Merge(int x,int y) {
    if(!x||!y) return y?y:x;
    if(A[x]>A[y]) swap(x,y);
    R[x]=Merge(R[x],y);
    if(D[L[x]]<D[R[x]]) swap(L[x],R[x]);
    D[x]=D[R[x]]+1;
    return x;
}
void Del(int x) {
    b[x]=0,f[x]=Merge(L[x],R[x]),f[f[x]]=f[x];
}
 
int main() {
    n=in();
    for(int i=1;i<=n;i++) A[i]=in(),f[i]=i,b[i]=1;
    for(m=in();m--;) {
        char opt[15];
        scanf("%s",opt);
        if(opt[0]==‘M‘) {
            int u=in(),v=in();
            if(!b[u] || !b[v]) continue;
            u=find(u),v=find(v);
            if(u^v) f[u]=f[v]=Merge(u,v);
        } else {
             int ans=0,u=in();
             if(b[u]) u=find(u),ans=A[u],Del(u);
             printf("%d\n",ans);
        }
    }
    return 0;
}

  

以上是关于BZOJ 1455: 罗马游戏的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 1455: 罗马游戏

BZOJ 1455: 罗马游戏 [可并堆]

BZOJ 1455 1455: 罗马游戏 (可并堆-左偏树+并查集)

BZOJ1455罗马游戏 可并堆

[BZOJ1455] 罗马游戏

bzoj1455罗马游戏