CodeForces - 1629C
题意: 一个序列,每次可以从开头选择一个长度为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; } }