zoukankan      html  css  js  c++  java
  • 【题解】CF1375D Replace by MEX

    (color{purple}{Link})

    ( ext{Solution:})

    观察到题目要求操作次数不超过(2n,)且不必最小化操作次数,所以一定是构造题。

    考虑将序列转化为([0,1,...n-1].)于是,有以下操作方法:

    • (a_i=i-1)时,不予操作。
    • (a_i ot =i-1)(mex=n)时,任选一个不满足上面条件的(a_i)令它(=mex.)
    • (a_i ot=i-1)(mex ot =n)时,将(a_{mex+1}=mex)即可。

    观察可得,第二个操作每个数最多一次,第三个同样。所以操作次数不超过(2n.)

    #include<bits/stdc++.h>
    using namespace std;
    int T,n,a[200010];
    vector<int>v;
    inline bool check(){
    	for(int i=1;i<=n;++i)if(a[i]!=i-1)return false;
    	return true;
    }
    int main(){
    	scanf("%d",&T);
    	while(T--){
    		scanf("%d",&n);v.clear();
    		for(int i=1;i<=n;++i)scanf("%d",a+i);
    		while(!check()){
    			for(int i=1;i<=n;++i){
    				if(a[i]==i-1)continue;
    				else{
    					int vis[2001];
    					fill(vis,vis+n+1,0);
    					for(int j=1;j<=n;++j)vis[a[j]]++;
    					int mex=0;while(vis[mex])mex++;
    					if(mex==n){
    						int p;
    						for(int j=1;j<=n;++j){
    							if(a[j]!=j-1){
    								p=j;
    								break;
    							}
    						}
    						v.push_back(p);a[p]=mex;
    					}
    					else a[mex+1]=mex,v.push_back(mex+1);
    					break;
    				}
    			}
    		}
    		cout<<(int)v.size()<<endl;
    		for(int i=0;i<(int)v.size();++i)cout<<v[i]<<" ";
    		cout<<endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    原码, 反码, 补码 详解
    位移运算符
    ASP.NET中httpmodules与httphandlers全解析
    MySQL count
    真正的能理解CSS中的line-height,height与line-height
    IfcEvent
    IfcWorkCalendarTypeEnum
    IfcSingleProjectInstance
    转换模型
    IfcTypeProduct
  • 原文地址:https://www.cnblogs.com/h-lka/p/13343434.html
Copyright © 2011-2022 走看看