题目链接:
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 }