• 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
    左偏树裸题详见刘汝佳《高级数据结构》【应该没有讲的比那个好的ppt了】
     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<string>
     4 #include<string.h>
     5 #include<iostream>
     6 #include<algorithm>
     7 #include<queue>
     8 #include<math.h>
     9 #include<vector>
    10 #include<map>
    11 #include<set>
    12 #define il inline
    13 #define re register
    14 using namespace std;
    15 const int N=1000010;
    16 int n,f[N],l[N],r[N],d[N],v[N],Q;
    17 bool die[N];
    18 il int read(){
    19     re int hs=0;re char c=getchar();
    20     while(!isdigit(c)) c=getchar();
    21     while(isdigit(c)){
    22         hs=(hs<<3)+(hs<<1)+c-'0';
    23         c=getchar();
    24     }
    25     return hs;
    26 }
    27 il void swap(re int &a,re int &b){
    28     a^=b;
    29     b^=a;
    30     a^=b;
    31 }
    32 il int getfather(re int u){
    33     return f[u]==u?u:f[u]=getfather(f[u]);
    34 }
    35 il int merge(re int a,re int b){
    36     if(!a) return b;
    37     if(!b) return a;
    38     if(v[a]>v[b]) swap(a,b);
    39     r[a]=merge(r[a],b);
    40     if(d[r[a]]>d[l[a]]) swap(l[a],r[a]);
    41     d[a]=d[r[a]]+1;
    42     return a;
    43 }
    44 int main(){
    45     n=read();char str[9];
    46     for(int i=1;i<=n;i++) v[i]=read();
    47     for(int i=1;i<=n;i++) f[i]=i;
    48     Q=read();d[0]=-1;
    49     for(re int i=1,p,q,fp,fq;i<=Q;i++){
    50         scanf("%s",str);p=read();
    51         if(str[0]=='M'){
    52             q=read();
    53             if(die[p]||die[q]) continue;
    54             fp=getfather(p);
    55             fq=getfather(q);
    56             if(fp!=fq) f[fp]=f[fq]=merge(fp,fq);
    57         }
    58         else{
    59             if(die[p]) printf("0
    ");
    60             else{
    61                 q=getfather(p);die[q]=1;
    62                 printf("%d
    ",v[q]);
    63                 f[q]=merge(l[q],r[q]);
    64                 f[f[q]]=f[q];
    65             }
    66         }
    67     }
    68     return 0;
    69 }
  • 相关阅读:
    在64位Win7下安装Oracle 10g客户端,以及PL/SQL Developer的经验
    Windows 8/Windows 8.1激活CMD命令大全
    安装交叉编译工具出错,arm-linux-gcc: 没有那个文件或目录
    驱动设备号创建
    内核驱动调试
    stm32定时器接力
    linux常用命令
    stm32定时器外部计数
    stm32 flash 选择
    pymysql 使用twisted异步插入数据库:基于crawlspider爬取内容保存到本地mysql数据库
  • 原文地址:https://www.cnblogs.com/ExiledPoet/p/5803201.html
Copyright © 2020-2023  润新知