Codeforces Round #584 - Dasha Code Championship - Elimination Round (rated, open for everyone, Div.

題目:https://codeforc.es/contest/1209/problem/G1c++

題意:給你一個序列,要你進行一些操做後把他變成一個好序列,好序列的定義是,兩個相同的數中間的數都要與他相同,能夠把某一種數統一變成另外一個數,問最少變得個數數組

思路:咱們能夠考慮貪心,對於一個互相牽扯的區間,我確定是用總長減掉裏面出現次數最多的元素纔是最划得來的,咱們直接求出這些牽扯區間的長度便可,方法就是我用數組記錄每一個元素出現最右的位置,而後從左到右遍歷,我保留當前區間往右延伸的最長位置,而後減去出現最多便可,累加全部這種聯通塊spa

 

 

#include<bits/stdc++.h>
#define maxn 200005
#define mod 1000000007
using namespace std;
typedef long long ll;
ll n,q,a[maxn];
ll num[maxn],dex[maxn];
int main(){
    cin>>n>>q;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        num[a[i]]++;
        dex[a[i]]=i;
    }
    ll l=1;
    ll ans=0,mx=0,r=0;
    for(int i=1;i<=n;i++){
        r=max(r,dex[a[i]]);
        mx=max(mx,num[a[i]]);
        if(i==r){
            ans+=r-l+1-mx;
            mx=0;l=r+1;
            r=0;
        }
    }
    cout<<ans;
} 
相關文章
相關標籤/搜索