码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ 1455: 罗马游戏

时间:2017-03-14 16:31:03      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:ace   class   find   getc   script   merge   namespace   using   罗马   

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: 罗马游戏

标签:ace   class   find   getc   script   merge   namespace   using   罗马   

原文地址:http://www.cnblogs.com/beiyuoi/p/6549163.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!