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 }

 

posted @ 2017-05-26 18:12  _yxg123  阅读(169)  评论(0编辑  收藏  举报