【算法】可并堆(左偏树)

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=;
int l[maxn],r[maxn],fa[maxn],d[maxn],a[maxn],n,m;
bool die[maxn];//0生1死
int find(int x)
{return fa[x]==x?x:fa[x]=find(fa[x]);}
int merge(int x,int y)//返回x和y合并后子树的根
{
if(!x)return y;
if(!y)return 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]]+;//更新节点距离
return x;//返回新树根
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=n;i++)fa[i]=i;
d[]=-;//因为后面的空节点都表示为0,因此会多次调用0。
scanf("%d",&m);
for(int i=;i<=m;i++)
{
char c=getchar();
while(c!='M'&&c!='K')c=getchar();
if(c=='M')
{
int x,y;
scanf("%d%d",&x,&y);
if(die[x]||die[y])continue;
int p=find(x),q=find(y);
if(p!=q)
{
int t=merge(p,q);//t是新根,可能是fa[x]或fa[y]
fa[p]=fa[q]=t;//p,q的父亲变为新根,其他点父亲均不变
}
}
else
{
int x;
scanf("%d",&x);
if(die[x]){printf("0\n");continue;}
int p=find(x);die[p]=;
printf("%d\n",a[p]);
fa[p]=merge(l[p],r[p]);//返回新根(l[p]或r[p]),令原根的父亲为新根,由于并查集,不需要再修改
fa[fa[p]]=fa[p];//注意改变新根的父亲
//为什么不能直接加个if判断新根左右然后修改左右父亲啊?改完交了RE,存疑……
}
}
return ;
}

另有蒟蒻WA的代码,错误已标注。

WA Code >_<

【BZOJ】1455 罗马游戏的更多相关文章

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

    1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 668  Solved: 247[Submit][Status] Descriptio ...

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

    可并堆水题 --------------------------------------------------------- #include<bits/stdc++.h>   usin ...

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

    1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1715  Solved: 718[Submit][Status][Discuss] ...

  4. bzoj 1455: 罗马游戏

    1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MB Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最 ...

  5. BZOJ 1455 罗马游戏 左偏树

    题目大意:给定n个点,每一个点有一个权值,提供两种操作: 1.将两个点所在集合合并 2.将一个点所在集合的最小的点删除并输出权值 非常裸的可并堆 n<=100W 启示式合并不用想了 左偏树就是快 ...

  6. BZOJ 1455 罗马游戏 ——左偏树

    [题目分析] 左偏树的模板题目,大概就是尽量维护树的深度保持平衡,以及尽可能的快速合并的一种堆. 感觉和启发式合并基本相同. 其实并没有快很多. 本人的左偏树代码自带大常数,借鉴请慎重 [代码] #i ...

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

    1455: 罗马游戏 Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那 ...

  8. 1455: 罗马游戏[左偏树or可并堆]

    1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1861  Solved: 798[Submit][Status][Discuss] ...

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

    1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1355  Solved: 561[Submit][Status][Discuss] ...

随机推荐

  1. 项目uml

    [团队信息] 团队项目: 小葵日记--主打记录与分享模式的日记app 队名:日不落战队 队员信息及贡献分比例: 短学号 名 本次作业博客链接 此次作业任务 贡献分配 备注 501 安琪 http:// ...

  2. 用select模拟一个socket server成型版2

    1.字典队列测试 import queue msg_dic={} msg_dic[1]=queue.Queue() msg_dic[1].put('hello') msg_dic[1].put('bo ...

  3. springboot2.0 快速集成kafka

    一.kafka搭建 参照<kafka搭建笔记> 二.版本 springboot版本 <parent> <groupId>org.springframework.bo ...

  4. 【国家集训队】聪聪可可 ——树形DP

    感觉是一道很妙的树形DP题,充分利用到了树的性质(虽然说点分治也可以做,,,,但是本蒟蒻不会啊) 然而某Twilight_Sx大佬表示这道题真的非常水,,,本蒟蒻也只能瑟瑟发抖了 本蒟蒻表示还是要经过 ...

  5. Android 通知机制 Toast和Notification

    Android常用的反馈系统状态信息的方式主要有三种 Toast提醒 通知栏提醒 对话框提醒 三种提醒分别适用于页面的提示.系统交互事件的通知和非常重要的提醒: 一.Toast Toast toast ...

  6. POJ2976:Dropping tests——题解

    http://poj.org/problem?id=2976 题目大意:给定n个二元组(a,b),从中取n-k个,使得100*∑a/∑b最大. 01分数规划裸题,设λ是小于等于最优解的,那么λ< ...

  7. BZOJ2830 & 洛谷3830:[SHOI2012]随机树——题解

    https://www.luogu.org/problemnew/show/P3830#sub   <-题面看这里~ https://www.lydsy.com/JudgeOnline/prob ...

  8. [NOI2008] 道路设计

    link 思维题目,题目描述其实说的就是这是一个树,想到树形$dp$.若两个铁路不向交,则每个点的度都$\leq 2$.所以现在就可以搞dp了. 怎么去维护答案,容易想到设$dp(i,j,k)$为现在 ...

  9. JS中验证URL、图片

    //验证URL function IsURL (str_url) { var strRegex = '^((https|http|ftp|rtsp|mms)?://)' + '?(([0-9a-z_! ...

  10. JavaScript中字符串与16进制之间的转换

    一.字符串转换为16进制 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...