【BZOJ 1455】ロマネスクを並べて遊ぶことができます.


リンク:
#include <stdio.h>
int main()
{
    puts("       [vmurder]  ");
    puts("  :blog.csdn.net/vmurder/article/details/44513511");
}
クイズ:
しかし、ヒープ:実際には、データ構造ではなく、関数です.データ構造は「ヒープ」です.統合可能なランダムヒープは一つですか?
二つの山が合体する時、大きさを比較して父を決定し、劣悪な子と優子を再帰的に比較して、頭が空になるまで(もう比較しなくてもいいです)、正常な挿入を満足させることができます.二叉の性質を保証する時に停止します.
コード:
ランダムにヒープすることができます.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 1001000
#define inf 0x3f3f3f3f
using namespace std;
struct Merge_Heap
{
    int son[N][2],val[N];
    bool be_killed[N];

    int fa[N];
    int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
    void init(int n)
    {
        val[0]=inf;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&val[i]);
            fa[i]=i;
        }
    }
    int merge(int x,int y) //        
    {
        if(val[x]>val[y])swap(x,y);
        if((x&&y)==0)return x;
        int k=rand()&1;
        son[x][k]=merge(son[x][k],y);
        return x;
    }
    void kill()
    {
        int x;
        scanf("%d",&x);
        if(be_killed[x])
        {
            puts("0");
            return ;
        }
        x=find(x);
        be_killed[x]=1;
        printf("%d
"
,val[x]); int k=merge(son[x][0],son[x][1]); if(k)fa[x]=fa[son[x][0]]=fa[son[x][1]]=k; } void battle() { int x,y; scanf("%d%d",&x,&y); if(be_killed[x]||be_killed[y])return ; if(find(x)==find(y))return ; fa[fa[x]]=fa[fa[y]]=merge(fa[x],fa[y]); } }heap; int n,m; char opt[5]; int main() { // freopen("test.in","r",stdin); srand(252503); int i,k; scanf("%d",&n); heap.init(n); for(scanf("%d",&m);m--;) { scanf("%s",opt); if(opt[0]=='K')heap.kill(); else heap.battle(); } return 0; }