zoukankan      html  css  js  c++  java
  • Codeforces Round #245 (Div. 2) B. Balls Game 并查集

    题目链接:

    http://codeforces.com/problemset/problem/430/B

    题意:

    类似对对碰一样,大于三个的同样颜色的球连在一起就可以消灭,你可以插一个球,然后问你最多消灭多少个

    思路:

    卿学姐: http://www.cnblogs.com/qscqesze/p/4428295.html

    暴力枚举插入的位置,然后用一个并查集维护一下就好啦,并查集维护的是前一个与当前颜色相同的位置在哪,其实最多有两个相同的颜色在一起,没有必要用并查集维护,直接遍历过去也是一样的。。。

    找的时候两个指针,判断两边的颜色是否相同,以及相同的颜色是不是大于3

    代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 #define MS(a) memset(a,0,sizeof(a))
     5 #define MP make_pair
     6 #define PB push_back
     7 const int INF = 0x3f3f3f3f;
     8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
     9 inline ll read(){
    10     ll x=0,f=1;char ch=getchar();
    11     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    12     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    13     return x*f;
    14 }
    15 //////////////////////////////////////////////////////////////////////////
    16 const int maxn = 1e5+10;
    17 
    18 int n,k,x,a[105];
    19 int pre[105],dp[105];
    20 
    21 int find(int x){
    22     return pre[x]==x ? x : pre[x]=find(pre[x]);
    23 }
    24 
    25 int f(int k){
    26     int l = find(k);
    27     int r = k;
    28     int res = r-l+1;
    29     while(1){
    30         if(l<=1) break;
    31         else l--;
    32         if(r>=n) break;
    33         else r++;
    34         int c1=a[l],c2=a[r];
    35         int t1=0,t2=0;
    36         while(a[l]==c1){
    37             if(l <= 0) break;
    38             l--;
    39             t1++;
    40         }l++;
    41         while(a[r]==c2){
    42             if(r >= n+1) break;
    43             r++;
    44             t2++;
    45         }r--;
    46         if(t1+t2 < 3) break;
    47         if(c1 != c2) break;
    48         res += t1+t2;
    49     }
    50     return res;
    51 }
    52 
    53 int main(){
    54     cin >> n >> k >> x;
    55     for(int i=1; i<=n; i++){
    56         pre[i] = i;
    57         cin >> a[i];
    58         if(a[i] == a[i-1]){
    59             dp[i] = dp[i-1]+1;
    60             pre[i] = find(i-1);
    61         }else{
    62             dp[i] = 1;
    63         }
    64     }
    65 
    66     int ans = 0;
    67     for(int i=n; i>=1; i--){
    68         if(dp[i]>=2 && a[i]==x){
    69             ans = max(f(i),ans);
    70             i = find(i);
    71         }
    72     }
    73 
    74     cout << ans << endl;
    75 
    76     return 0;
    77 }
  • 相关阅读:
    windows上传代码到Gitee
    gitee推送报错error: failed to push some refs to
    socket和http区别
    腿姐考前叮嘱
    20数学真题答案
    windows下如何查看磁盘IO性能 复制于网络上
    初识WCF异常 1
    WCF中DBNull序列化的问题
    在SQL Server数据库之间进行数据导入导出
    在Silverlight中打开网页的几种方法
  • 原文地址:https://www.cnblogs.com/yxg123123/p/6909911.html
Copyright © 2011-2022 走看看