Codeforces-1672 C: Unequal Array
题目
题目截图

样例描述

题目大意
  给定一个长度为 
    
     
      
       
        n
       
      
      
       n
      
     
    n 的数组 
    
     
      
       
        a
       
      
      
       a
      
     
    a。定义这个数组的相等性为满足条件 
    
     
      
       
        
         a
        
        
         i
        
       
       
        =
       
       
        
         a
        
        
         
          i
         
         
          +
         
         
          1
         
        
       
       
        ,
       
       
        i
       
       
        ∈
       
       
        [
       
       
        1
       
       
        ,
       
       
        n
       
       
        −
       
       
        1
       
       
        ]
       
      
      
       a_i=a_{i+1},i\in[1,n-1]
      
     
    ai=ai+1,i∈[1,n−1] 的 
    
     
      
       
        i
       
      
      
       i
      
     
    i 的数量。
   现在可以对这个数组做一些操作,可以选择一个下标 
    
     
      
       
        i
       
       
        ∈
       
       
        [
       
       
        1
       
       
        ,
       
       
        n
       
       
        −
       
       
        1
       
       
        ]
       
      
      
       i \in [1,n-1]
      
     
    i∈[1,n−1],将 
    
     
      
       
        
         a
        
        
         i
        
       
      
      
       a_i
      
     
    ai 和 
    
     
      
       
        
         a
        
        
         
          i
         
         
          +
         
         
          1
         
        
       
      
      
       a_{i+1}
      
     
    ai+1 都设置为 
    
     
      
       
        x
       
      
      
       x
      
     
    x,问最少需要多少次操作,能够让 这个数组的相等性 
    
     
      
       
        ≤
       
       
        1
       
      
      
       \le 1
      
     
    ≤1。-
题目解析
  首先考虑一般的情况,我们假设有 
    
     
      
       
        a
       
       
        =
       
       
        [
       
       
        ⋯
       
       
        X
       
       
        X
       
       
        X
       
       
        X
       
       
        ⋯
       
       
        Y
       
       
        Y
       
       
        Y
       
       
        ⋯
       
       
        Z
       
       
        Z
       
       
        Z
       
       
        ⋯
        
       
        ]
       
      
      
       a = [\cdots XXXX\cdots YYY \cdots ZZZ \cdots]
      
     
    a=[⋯XXXX⋯YYY⋯ZZZ⋯],显然这个数组是不符合相等性条件的,那么我们怎么样使用给定的方法消除里面相等的部分呢?
   首先,我们注意到一共只有不超过 
    
     
      
       
        2
       
       
        e
       
       
        5
       
      
      
       2e5
      
     
    2e5 的数,但数值范围有 
    
     
      
       
        1
       
       
        e
       
       
        9
       
      
      
       1e9
      
     
    1e9,这意味着我们赋值的时候每次都赋值 
    
     
      
       
        x
       
      
      
       x
      
     
    x 为从没出现过的数就好了。然后,对于多个连续相等的情况,我们从第一段第二位开始,就要赋值 
    
     
      
       
        x
       
      
      
       x
      
     
    x 了,这样带来的结果是 
    
     
      
       
        a
       
       
        =
       
       
        [
       
       
        ⋯
       
       
        X
       
       
        A
       
       
        A
       
       
        X
       
       
        ⋯
       
       
        Y
       
       
        Y
       
       
        Y
       
       
        ⋯
       
       
        Z
       
       
        Z
       
       
        Z
       
       
        ⋯
        
       
        ]
       
      
      
       a = [\cdots XAAX\cdots YYY \cdots ZZZ \cdots]
      
     
    a=[⋯XAAX⋯YYY⋯ZZZ⋯],根据题目要求,我们只有最后只有两个数是相等且连续出现的,但我们每次赋值,都必然会留下一个相等连续出现的数,这使得我们必须接着向后进行 
    
     
      
       
        a
       
       
        =
       
       
        [
       
       
        ⋯
       
       
        X
       
       
        A
       
       
        B
       
       
        B
       
       
        ⋯
       
       
        Y
       
       
        Y
       
       
        Y
       
       
        ⋯
       
       
        Z
       
       
        Z
       
       
        Z
       
       
        ⋯
        
       
        ]
       
      
      
       a = [\cdots XABB\cdots YYY \cdots ZZZ \cdots]
      
     
    a=[⋯XABB⋯YYY⋯ZZZ⋯],看到这里,我们不难发现,按这样赋值,每次我们都可以将首次出现连续相等的位置向后移动一位,显然,当到最后一次时,
    
     
      
       
        a
       
       
        =
       
       
        [
       
       
        ⋯
       
       
        X
       
       
        A
       
       
        B
       
       
        C
       
       
        ⋯
       
       
        D
       
       
        D
       
       
        Z
       
       
        ⋯
        
       
        ]
       
      
      
       a = [\cdots XABC\cdots DDZ \cdots]
      
     
    a=[⋯XABC⋯DDZ⋯],这样,我们就能得到题目想要的结果。这个过程中,设首次出现连续相等段的起点为 s,最后一次出现的终点为 e,那么显然这样结果就是 
    
     
      
       
        (
       
       
        e
       
       
        −
       
       
        1
       
       
        )
       
       
        −
       
       
        (
       
       
        s
       
       
        +
       
       
        1
       
       
        )
       
       
        =
       
       
        e
       
       
        −
       
       
        s
       
       
        −
       
       
        2
       
      
      
       (e - 1) - (s + 1) = e - s - 2
      
     
    (e−1)−(s+1)=e−s−2。
   特别地,需要注意两个地方,一个是本就满足条件的情况(
    
     
      
       
        e
       
       
        d
       
       
        <
       
       
        s
       
       
        t
       
      
      
       ed \lt st
      
     
    ed<st 对应连续段唯一且长度只有 
    
     
      
       
        2
       
      
      
       2
      
     
    2 或没有连续段),另一个是连续段长度为 
    
     
      
       
        3
       
      
      
       3
      
     
    3 时,我们只需要赋值一次,此时答案应为 
    
     
      
       
        1
       
      
      
       1
      
     
    1。
Code
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 7;
int a[maxn], b[maxn], cnt[maxn];
int main() {
    int t, n;
    cin >> t;
    while(t--) {
        cin >> n >> a[1];
        int st = 0, ed = -1;
        for(int i=2; i<=n; ++i) {
            cin >> a[i];
            if(st == 0 && a[i] == a[i-1]) st = i;
            if(a[i] == a[i-1]) ed = i - 1;
        }
        if(ed < st) cout << 0 << endl; else
        cout << max(1, ed - st) << endl;
    }
    return 0;
}










