• 【bzoj1455】罗马游戏


    1455: 罗马游戏

    Time Limit: 5 Sec  Memory Limit: 64 MB
    Submit: 1061  Solved: 439
    [Submit][Status][Discuss]

    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
     
    左偏树裸题
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<ctime>
     6 #include<cstdlib>
     7 #include<algorithm>
     8 using namespace std;
     9 int n,m,a[1000100],f[1000100],die[1000100],r[1000100],l[1000100],dist[1000100];
    10 inline int read()
    11 {
    12     int x=0,f=1;  char ch=getchar();
    13     while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getchar();}
    14     while(isdigit(ch))  {x=x*10+ch-'0';  ch=getchar();}
    15     return x*f;
    16 }
    17 int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
    18 int merge(int x,int y)
    19 {
    20     if(!x)  return y;
    21     if(!y)  return x;
    22     if(a[x]>a[y])  swap(x,y);
    23     r[x]=merge(r[x],y);
    24     if(dist[r[x]]>dist[l[x]])  swap(r[x],l[x]);
    25     dist[x]=dist[r[x]]+1;
    26     return x;
    27 }
    28 int main()
    29 {
    30     freopen("cin.in","r",stdin);
    31     freopen("cout.out","w",stdout);
    32     n=read();
    33     for(int i=1;i<=n;i++)  {a[i]=read();  f[i]=i;}
    34     m=read();  dist[0]=-1;
    35     for(int i=1;i<=m;i++)
    36     {
    37         char ch=getchar();
    38         if(ch=='M')
    39         {
    40             int x=read(),y=read();
    41             if(die[x]||die[y])  continue;
    42             x=find(x);  y=find(y);
    43             if(x!=y)
    44             {
    45                 int t=merge(x,y);
    46                 f[x]=f[y]=t;
    47             }
    48         }
    49         else 
    50         {
    51             int x=read();
    52             if(die[x])  printf("0
    ");
    53             else 
    54             {
    55                 x=find(x);  die[x]=1;
    56                 printf("%d
    ",a[x]);
    57                 f[x]=merge(l[x],r[x]);
    58                 f[f[x]]=f[x];
    59             }
    60         }
    61     }
    62     return 0;
    63 }
    View Code

      

  • 相关阅读:
    java连接mysql以及增删改查操作
    Django中ORM表的创建以及基本增删改查
    python链接mysql以及mysql中对表修改的常用语法
    Windows系统安装MySQL
    php 之 excel导出导入合并
    玄学基础
    ubuntu 17.10 安装QQ
    CI框架导入 excel
    atom插件安装
    excel怎么截取字符串
  • 原文地址:https://www.cnblogs.com/chty/p/5826960.html
Copyright © 2020-2023  润新知