CodeForces - 1629C

Problem - 1629C - Codeforces

题意: 一个序列,每次可以从开头选择一个长度为K的序列,然后得到这个序列的MEX(最小的未出现的数),问最后可以求得的字典大小最大的序列是多少。

题解: 就是一种暴力的优化,开始时将每个数字出现的次数存储起来,然后从头开始遍历,每读一个数,都将这个数标记,以及将这个数出现的次数-1,这样后面判断这个数出现的次数,如果为0,证明这个数是这个序列能出现的最大数,不能再往上增加。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+5;
ll a[N];
ll sum[N];
ll mp[N];    
vector<ll> ans;
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0); 
    ll t;cin>>t;
    ll id=1;//用来表示每一个部分的最大值
    while(t--){
        ll n;cin>>n;
        ll maxn=0;
        ans={};
        for(ll i=1;i<=n;i++) cin>>a[i],sum[a[i]]++;
        for(ll i=1;i<=n;i++){
           sum[a[i]]--;mp[a[i]]=id;
           while(mp[maxn]==id) maxn++;//找到最大值
           if(!sum[maxn]){//判断这个最大值可不可能再增加
             ans.push_back(maxn);
             maxn=0;
             id++;
           }
        }
        cout<<ans.size()<<endl;
        for(ll i=0;i<ans.size();i++) cout<<ans[i]<<" ";
        cout<<endl;
    }
}

 

posted @ 2022-07-15 19:41  HHzp  阅读(33)  评论(0)    收藏  举报