首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Codeforces Round #710 (Div. 3) E. Restoring the Permutation(贪心、模拟)

Codeforces Round #710 (Div. 3) E. Restoring the Permutation(贪心、模拟)

作者头像
glm233
发布2021-04-01 17:01:55
发布2021-04-01 17:01:55
4620
举报

维护一个当前可以插入数的set

如果当前数等于上一个数,那么字典序最大序列答案就是set最大值,取出并删除、字典序最小序列答案就是set最小值,取出并删除

如果不等,那么最大序列和最小序列这个位置的数就是该数

代码语言:javascript
复制
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e5+10;
ll t,a[N],maxx[N],minn[N];
 
int main(){
	cin>>t;
	while(t--){
		
		int x;
		cin>>x;
		set<int>t1,t2;
		for(int i=1;i<=x;i++)cin>>a[i];
		maxx[1]=minn[1]=a[1];
		for(int i=1;i<a[1];i++){
			t1.insert(i);
			t2.insert(i);
		}
		for(int i=2;i<=x;i++){
			if(a[i]!=a[i-1]){
				maxx[i]=minn[i]=a[i];
				for(int j=a[i-1]+1;j<a[i];j++){
					t1.insert(j),t2.insert(j);
				}
			}
			else{
				set<int>::iterator it=t2.end();
				--it;
				
				int res1=*t1.begin(),res2=*it;
				minn[i]=res1,maxx[i]=res2;
				t1.erase(res1),t2.erase(res2);
				
			}
		}
		for(int i=1;i<=x;i++)cout<<minn[i]<<" ";
		cout<<endl;
		for(int i=1;i<=x;i++)cout<<maxx[i]<<" ";
		cout<<endl;
			
		
		
		
	}
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档