BZOJ 1455 罗马游戏 左偏树

题目大意:给定n个点,每个点有一个权值,提供两种操作:

1.将两个点所在集合合并

2.将一个点所在集合的最小的点删除并输出权值

很裸的可并堆 n<=100W 启发式合并不用想了

左偏树就是快啊~

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 1001001
using namespace std;
struct abcd{
    abcd *ls,*rs;
    int h,pos,score;
    abcd(int x,int y);
}*null=new abcd(0,0x3f3f3f3f),*tree[M];
abcd :: abcd(int x,int y)
{
    ls=rs=null;
    if(!null) h=-1;
    else h=0;
    pos=x;score=y;
}
abcd* Merge(abcd *x,abcd *y)
{
    if(x==null) return y;
    if(y==null) return x;
    if(x->score>y->score)
        swap(x,y);
    x->rs=Merge(x->rs,y);
    if(x->ls->h<x->rs->h)
        swap(x->ls,x->rs);
    x->h=x->rs->h+1;
    return x;
}
int n,m;
int fa[M];
bool dead[M];
int Find(int x)
{
    if(!fa[x]||fa[x]==x)
        return fa[x]=x;
    return fa[x]=Find(fa[x]);
}
void Unite(int x,int y)
{
    x=Find(x);y=Find(y);
    if(x==y) return ;
    fa[x]=y;
    tree[y]=Merge(tree[x],tree[y]);
}
int main()
{

    //freopen("1455.in","r",stdin);
    //freopen("1455.out","w",stdout);

    int i,x,y;
    char p[10];
    cin>>n;
    for(i=1;i<=n;i++)
        scanf("%d",&x),tree[i]=new abcd(i,x);
    cin>>m;
    for(i=1;i<=m;i++)
    {
        scanf("%s",p);
        if(p[0]=='M')
        {
            scanf("%d%d",&x,&y);
            if(dead[x]||dead[y])
                continue;
            Unite(x,y);
        }
        else
        {
            scanf("%d",&x);
            if(dead[x])
            {
                puts("0");
                continue;
            }
            x=Find(x);
            printf("%d\n",tree[x]->score);
            dead[tree[x]->pos]=1;
            tree[x]=Merge(tree[x]->ls,tree[x]->rs);
        }
    }
}
时间: 2024-10-14 02:52:34

BZOJ 1455 罗马游戏 左偏树的相关文章

bzoj 1455: 罗马游戏 左偏树+并查集

1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 668  Solved: 247[Submit][Status] Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻.他决定玩这样一个游戏. 它可以发两种命令: 1. Merger(i, j).把i所在的团和j所在的团合并成一个团.如果

[BZOJ1455] 罗马游戏|左偏树

1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 870  Solved: 347[Submit][Status][Discuss] Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻.他决定玩这样一个游戏. 它可以发两种命令: 1. Merger(i, j).把i所在的团和j所在的团

[BZOJ 1455]罗马游戏(左偏树+并查集)

Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻.他决定玩这样一个游戏. 它可以发两种命令: 1. Merger(i, j).把i所在的团和j所在的团合并成一个团.如果i, j有一个人是死人,那么就忽略该命令. 2. Kill(i).把i所在的团里面得分最低的人杀死.如果i这个人已经死了,这条命令就忽略. 皇帝希望他每发布一条kill命令,下面的

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

1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1715  Solved: 718[Submit][Status][Discuss] Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻.他决定玩这样一个游戏. 它可以发两种命令: 1. Merger(i, j).把i所在的团和j所在的

[bzoj 1455]罗马游戏

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1455 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1978  Solved: 857[Submit][Status][Discuss] Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以

BZOJ 1455: 罗马游戏( 配对堆 + 并查集 )

可并堆水题 --------------------------------------------------------- #include<bits/stdc++.h> using namespace std; const int maxn = 1000009; struct Node { Node *l, *r, *ch; int v, id; } pool[maxn], *null, *pt = pool, *q[maxn]; Node* newNode(int v, int id)

BZOJ 1455 罗马游戏 可并堆裸

题意:链接 方法:可并堆 解析: 来二中的第几天来着忘记了,讲了可并堆,于是去找裸题来刷. 对于合并操作,如果有一个为空则根为另一个. 然后我们不妨假设x键值小于y. 那么由于左偏树的左右子树同为左偏树,所以整个过程就形成了个递归 即把x的右子树再与y为根的子树合并. 合并后维护左偏,即保证NPL的左比右大. 之后再更新根节点的NPL. 其实以上就是合并的全过程,只是叙述一遍加深记忆而已. 代码: #include <cstdio> #include <cstring> #incl

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

1455: 罗马游戏 Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻.他决定玩这样一个游戏. 它可以发两种命令: 1. Merger(i, j).把i所在的团和j所在的团合并成一个团.如果i, j有一个人是死人,那么就忽略该命令. 2. Kill(i).把i所在的团里面得分最低的人杀死.如果i这个人已经死了,这条命令就忽略. 皇帝希望他每发布一

【BZOJ-1455】罗马游戏 可并堆 (左偏树)

1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1355  Solved: 561[Submit][Status][Discuss] Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻.他决定玩这样一个游戏. 它可以发两种命令: 1. Merger(i, j).把i所在的团和j所在的