zoukankan      html  css  js  c++  java
  • 【BZOJ1455】罗马游戏 可并堆

    【BZOJ1455】罗马游戏

    Description

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

    Input

    第一行一个整数n(1<=n<=1000000)。n表示士兵数,m表示总命令数。 第二行n个整数,其中第i个数表示编号为i的士兵的分数。(分数都是[0..10000]之间的整数) 第三行一个整数m(1<=m<=100000) 第3+i行描述第i条命令。命令为如下两种形式: 1. M i j 2. K i

    Output

    如果命令是Kill,对应的请输出被杀人的分数。(如果这个人不存在,就输出0)

    Sample Input

    5
    100 90 66 99 10
    7
    M 1 5
    K 1
    K 1
    M 2 3
    M 3 4
    K 5
    K 4

    Sample Output

    10
    100
    0
    66

    题解:可并堆裸题,需要用并查集来判断a和b是否已经合并为一个团,再维护一下每个堆的堆顶元素

    #include <cstdio>
    #include <iostream>
    using namespace std;
    const int maxn=1000010;
    int ch[maxn][2],nvl[maxn],v[maxn],f[maxn],dead[maxn],rt[maxn];
    int n,m;
    char str[5];
    int find(int x)
    {
    	return (f[x]==x)?x:(f[x]=find(f[x]));
    }
    int merge(int x,int y)
    {
    	if(!x)	return y;
    	if(!y)	return x;
    	if(v[x]>v[y])	swap(x,y);
    	ch[x][1]=merge(ch[x][1],y);
    	if(nvl[ch[x][0]]<nvl[ch[x][1]])	swap(ch[x][0],ch[x][1]);
    	nvl[x]=nvl[ch[x][1]]+1;
    	return x;
    }
    int main()
    {
    	scanf("%d",&n);
    	int i,a,b;
    	for(i=1;i<=n;i++)	scanf("%d",&v[i]),rt[i]=f[i]=i;
    	scanf("%d",&m);
    	v[0]=-1;
    	for(i=1;i<=m;i++)
    	{
    		scanf("%s",str);
    		if(str[0]=='M')
    		{
    			scanf("%d%d",&a,&b);
    			if(dead[a]||dead[b])	continue;
    			a=find(a),b=find(b);
    			if(a!=b)
    			{
    				rt[b]=merge(rt[a],rt[b]);
    				f[a]=b;
    			}
    		}
    		if(str[0]=='K')
    		{
    			scanf("%d",&a);
    			if(dead[a])
    			{
    				printf("0
    ");
    				continue;
    			}
    			a=find(a),dead[rt[a]]=1;
    			printf("%d
    ",v[rt[a]]);
    			rt[a]=merge(ch[rt[a]][0],ch[rt[a]][1]);
    		}
    	}
    	return 0;
    }
  • 相关阅读:
    linux下启动和关闭网卡命令及DHCP上网
    python 编码问题
    paddlepaddle
    Convolutional Neural Network Architectures for Matching Natural Language Sentences
    deep learning RNN
    Learning Structured Representation for Text Classification via Reinforcement Learning 学习笔记
    Python IO密集型任务、计算密集型任务,以及多线程、多进程
    EM 算法最好的解释
    tensorflow 调参过程
    tensorflow 学习纪录(持续更新)
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/6532677.html
Copyright © 2011-2022 走看看