当前位置: 首页 > news >正文

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);
        }
    }
}


相关文章:

  • Linux FTP(三)
  • 推荐一个好的数据库工具Embarcadero DBArtisan
  • weak_ptr
  • cocos2d函数
  • [iOS]iOS获取设备信息经常用法
  • 用Java实现按字节长度截取字符串的方法
  • Ocr识别开篇
  • 在安卓上运行TensorFlow:让深度学习进入移动端
  • NTFS权限
  • 一般杀毒软件检测病毒原理
  • 关于OleVariant类型的疑问???
  • 技术助力第三次革命
  • redis持久化之RDB
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • CAML语句 多条件and使用
  • ----------
  • 【React系列】如何构建React应用程序
  • CentOS7 安装JDK
  • CSS实用技巧干货
  • Docker: 容器互访的三种方式
  • Git 使用集
  • JS数组方法汇总
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • nodejs:开发并发布一个nodejs包
  • npx命令介绍
  • php的插入排序,通过双层for循环
  • Python打包系统简单入门
  • Python连接Oracle
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • vue--为什么data属性必须是一个函数
  • 工作手记之html2canvas使用概述
  • 基于遗传算法的优化问题求解
  • 前嗅ForeSpider采集配置界面介绍
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 如何利用MongoDB打造TOP榜小程序
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • linux 淘宝开源监控工具tsar
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 进程与线程(三)——进程/线程间通信
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #162 (Div. 2)
  • #QT(智能家居界面-界面切换)
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • $ git push -u origin master 推送到远程库出错
  • (13)Hive调优——动态分区导致的小文件问题
  • (14)Hive调优——合并小文件
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (poj1.3.2)1791(构造法模拟)
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (十六)Flask之蓝图
  • (一)Neo4j下载安装以及初次使用
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)程序员疫苗:代码注入
  • .bat批处理(六):替换字符串中匹配的子串