罗马游戏 bzoj-1455

    题目大意:给你n个人,2种操作,m次操作:1.将i号士兵所在的集合的最小值删除 2.合并i和j两个士兵所在的团体

    注释:$1\le n\le 10^6$,$1\le m \le 10^5$。

      想法:又是GXZlegend讲课,可并堆中的左偏树。了解一下:

        一个具有堆性质的二叉树满足任意一个节点x中,dis[lson[x]]>=dis[rson[x]],其中,dis表示当前节点一直走右儿子的最长步数。合并是递归合并,我们通过递归处理一两个节点为根节点的左偏树的合并,显然左偏树的子树仍是左偏树。我们直接将一颗子树往另一颗子树的有儿子上挂,这两颗子树根节点大的(默认大根堆)当做合并后的根节点即可。

        附上合并代码... ...

void merge(int x,int y)
{
if(!x) return y;
if(!y) return x;
if(val[x]<val[y]) swap(x,y);
rson[x]=merge(rson[x],y);
if(dis[rson[x]]>dis[lson[x]]) swap(rson[x],lson[x]);
dis[x]=dis[rson[x]]+1;
return x;
}

      至于这道题,我们用并查集维护每个人在哪个队伍里即可

    最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1000010
using namespace std;
int fa[N],rson[N],lson[N],dis[N],w[N];
bool k[N];
int find(int x)
{
return fa[x]==x?x:(fa[x]=find(fa[x]));
}
int merge(int x,int y)
{
if(!x) return y;
if(!y) return x;
if(w[x]>w[y]) swap(x,y);
rson[x]=merge(rson[x],y);
if(dis[rson[x]]>dis[lson[x]])
{
swap(lson[x],rson[x]);
}
dis[x]=dis[rson[x]]+1;
return x;
}
inline int Kill(int x)
{
if(k[x]) return 0;
x=find(x);
int t=merge(lson[x],rson[x]);
fa[x]=t;
fa[t]=t;
k[x]=true;
return w[x];
}
int main()
{
int n,m;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&w[i]);
}
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
char s[3];
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%s",s+1);
if(s[1]=='M')
{
int x,y;
scanf("%d%d",&x,&y);
if(k[x]||k[y]) continue;
x=find(x),y=find(y);
if(x!=y) fa[x]=fa[y]=merge(x,y);
// fa[y]=x;
}
else
{
int x;
scanf("%d",&x);
printf("%d\n",Kill(x));
}
}
return 0;
}
/*
2
1 2
3
M 1 2
K 1
K 2
*/

    小结:错误都比较奇葩,在Kill的时候fa更新错了,merge函数在写的时候注意退出条件,不是任何时候都输出x的。

[bzoj1455]罗马游戏_左偏树_并查集的更多相关文章

  1. [BZOJ1455]罗马游戏(左偏树)

    用并查集和左偏树维护士兵的关系 Code #include <cstdio> #include <algorithm> #define N 1000010 using name ...

  2. 【BZOJ1455】罗马游戏(左偏树)

    [BZOJ1455]罗马游戏(左偏树) 题面 BZOJ 然而权限题. 题解 左偏树模板题. #include<iostream> #include<cstdio> #inclu ...

  3. 【bzoj1455】【罗马游戏】左偏树+并查集(模板)

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

  4. [bzoj4003][JLOI2015]城池攻占_左偏树

    城池攻占 bzoj-4003 JLOI-2015 题目大意:一颗n个节点的有根数,m个有初始战斗力的骑士都站在节点上.每一个节点有一个standard,如果这个骑士的战斗力超过了这个门槛,他就会根据城 ...

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

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

  6. BZOJ1455 罗马游戏 左偏树 可并堆

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1455 题意概括 n个人,2种操作. 一种是合并两个人团,一种是杀死某一个人团的最弱的人. 题解 左 ...

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

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

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

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

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

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

随机推荐

  1. PCB SQL SERVER 枚举分割函数(枚举值分解函数)

    在SQL SERVER字段采用枚举值作为字段后,如果直接查看字段的值是很难判断这个字段的带表什么意思, 在这里介绍如用函数的方法实现枚举值分割,只有分割后才很方便知道枚举值的意思. 一.问题说明 1. ...

  2. codevs3342绿色通道(单调队列优化dp)

    3342 绿色通道  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold   题目描述 Description <思远高考绿色通道>(Green Pass ...

  3. setjmp和longjmp函数

    关于setjmp函数和longjmp函数有话要说,是UNIX高级环境变成看到了10.10信号那章用到了,研究一下,这里作为补充. setjmp(jmp_buf env_buf) 函数可以将当前的运行环 ...

  4. Unity Android交互过坑指南

    Unity Android交互过坑指南 介于网上看过很多unity和Android交互的教程,都或多或少的漏掉了一些部分,导致编译过程中出现各种问题,特此整理一份教程,仅供参考 介绍 本次实现的是在游 ...

  5. Sql Server 如何解决多并发情况下,出现的多个相同ID数据

    在数据库中单独创建一张表,保存当前存储状态,“存储过程”  设置访问条件root初始值为“0” 如果root值不为0的时候就不可访问并进行相关操作. 在事务执行前将root值设置为1,事务结束后将ro ...

  6. reactnative(2) - Navigator 使用案例

    'use strict'; import React, { Component } from 'react'; import { AppRegistry, ScrollView, StyleSheet ...

  7. Android java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@412d7230

    近期遇到了如标题这种错误,再次记录解决方法.本文參考帖子: http://bbs.csdn.net/topics/390196217 出现此bug的原因是在内存回收上.里面用Bitamp的代码为: t ...

  8. Android 获取android安装apk框的安装状态(如点击取消、返回)

    最近鼓捣android,碰到个问题,因为没有root权限,需要调用Intent安装apk,但需要获取用户是否安装了(如,用户点击了返回或取消),查了很多文章,最后可以解决,但有瑕疵,解决方法如下: p ...

  9. Android基础TOP2_1:输出系统时间

    Activity: <TextView android:id="@+id/tv" android:layout_width="wrap_content" ...

  10. [Windows Server 2008] ASP.net安装方法

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:安装ASP.n ...