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;
    }
    
  • 相关阅读:
    Flask-SQLAlchemy
    with 与 上下文管理器
    使用@property
    C++:如何把一个int转成4个字节?
    尝试理解Flask源码 之 搞懂WSGI协议
    qt setData()和data()
    我使用过的Linux命令之sftp
    linux下如何使用sftp命令
    Linux环境下安装JDK
    CentOS 6.5 配置IP地址的三种方法
  • 原文地址:https://www.cnblogs.com/h-lka/p/13343434.html
Copyright © 2011-2022 走看看