zoukankan      html  css  js  c++  java
  • bzoj1455

    可并堆或set+并查集。。。

    set:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<cmath>
     5 #include<ctime>
     6 #include<cstdlib>
     7 #include<algorithm>
     8 #include<set>
     9 #define lowbit(a) ((a)&(-(a)))
    10 #define clr(a,x) memset(a,x,sizeof(a))
    11 #define rep(i,l,r) for(int i=l;i<(r);i++)
    12 using namespace std;
    13 typedef long long ll;
    14 typedef pair<int,int> pii;
    15 int read()
    16 {
    17     char c=getchar();
    18     int ans=0,f=1;
    19     while(!isdigit(c)){
    20         if(c=='-') f=-1;
    21         c=getchar();
    22     }
    23     while(isdigit(c)){
    24         ans=ans*10+c-'0';
    25         c=getchar();
    26     }
    27     return ans*f;
    28 }
    29 const int maxn=1000009;
    30 int n,m,f[maxn];
    31 set<pii>S[maxn];
    32 bool p[maxn];
    33 int find(int x){
    34     return f[x]==x?f[x]:f[x]=find(f[x]);
    35 }
    36 int main()
    37 {    
    38     rep(i,1,maxn) f[i]=i;clr(p,1);
    39     n=read();
    40     rep(i,1,n+1){
    41         int t=read();
    42         S[i].insert(make_pair(t,i));
    43     }
    44     m=read();
    45     while(m--){
    46         char opt=getchar();
    47         while(opt!='M'&&opt!='K') opt=getchar();
    48         if(opt=='M'){
    49             int x=read(),y=read();
    50             if(!p[x]||!p[y]) continue;
    51             x=find(x);y=find(y);
    52             if(x==y) continue;
    53             if(S[x].size()>S[y].size()) swap(x,y);f[x]=y;
    54             while(!S[x].empty()){
    55                 pii o=*S[x].begin();S[x].erase(S[x].begin());
    56                 S[y].insert(o);
    57             }
    58         }else{
    59             int x=read();
    60             if(!p[x]){
    61                 puts("0");
    62                 continue;
    63             }
    64             x=find(x);
    65             pii o=*S[x].begin();S[x].erase(S[x].begin());
    66             p[o.second]=0;
    67             printf("%d
    ",o.first);
    68         }
    69     }
    70     return 0;
    71 }
    View Code

    可并堆(回学校再来):

    1455: 罗马游戏

    Time Limit: 5 Sec  Memory Limit: 64 MB
    Submit: 877  Solved: 354
    [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

    HINT

     

    Source

  • 相关阅读:
    eslint 规则
    我的.eslintrc.js
    shell命令
    .sync 修饰符的理解
    【HNOI 2018】寻宝游戏
    【BZOJ 2820】YY的GCD
    【Luogu P2664】树上游戏
    【HAOI 2012】高速公路
    句摘
    【SCOI 2008】奖励关
  • 原文地址:https://www.cnblogs.com/chensiang/p/4823723.html
Copyright © 2011-2022 走看看