【BZOJ 1455】ロマネスクを並べて遊ぶことができます.
5008 ワード
リンク:
しかし、ヒープ:実際には、データ構造ではなく、関数です.データ構造は「ヒープ」です.統合可能なランダムヒープは一つですか?
二つの山が合体する時、大きさを比較して父を決定し、劣悪な子と優子を再帰的に比較して、頭が空になるまで(もう比較しなくてもいいです)、正常な挿入を満足させることができます.二叉の性質を保証する時に停止します.
コード:
ランダムにヒープすることができます.
#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;
}