比赛 2025.9.13 评测结果 AAAAAAAAAAAAAAAAAA
题目名称 The Best Lineup 最终得分 100
用户昵称 左清源 运行时间 2.307 s
代码语言 C++ 内存使用 13.04 MiB
提交时间 2025-09-13 10:41:07
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int T,n,a[N],st[N][21],len[N];
vector<int>vec[N],ans;
int qry(int l,int r){
	int v=0;
	for(int i=l;i<=r;i++){
		v=max(v,a[i]);
	}
	return v;
}
void work(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",a+i);st[0][i]=a[i];
		vec[a[i]].push_back(i);
	}
	int lim=0;
	ans.clear();
	ans.push_back(0); 
	for(int i=n;i>=1;i--){
		if(!vec[i].size())continue;
		for(int j:vec[i]){
			if(j>lim){
				ans.push_back(j);
				lim=j;
			}
		}
	}
	int len=ans.size()-1;
	bool f=1;
	for(int i=1;i<len;i++){
		if(a[ans[i]]!=a[ans[i+1]]){
			//cout<<qry(ans[i-1]+1,ans[i]-1)<<endl; 
			if(qry(ans[i-1]+1,ans[i]-1)>=a[ans[i+1]]){
				int x=a[ans[i]];
				for(int j=ans[i]-1;j>=ans[i-1];j--){
					a[j+1]=a[j];
				}
				a[ans[i-1]+1]=x,f=0;
				break;
			}
		}
	}
	if(f){
		int x=a[ans[len]];
		for(int j=ans[len]-1;j>ans[len-1];j--){
			a[j+1]=a[j];
		}
		a[ans[len-1]+1]=x;
	}
	ans.clear();
	for(int i=1;i<=n;i++)vec[i].clear();
	for(int i=1;i<=n;i++)vec[a[i]].push_back(i);
	lim=0;
	for(int i=n;i>=1;i--){
		if(!vec[i].size())continue;
		for(int j:vec[i]){
			if(j>lim){
				ans.push_back(j);
				lim=j;
			}
		}
	}
	for(auto v:ans){
		printf("%d ",a[v]);
	} 
	ans.clear();
	for(int i=1;i<=n;i++)vec[i].clear();
	printf("\n");
	return;
} 
int main(){
	freopen("Lineup.in","r",stdin);
	freopen("Lineup.out","w",stdout);  
	scanf("%d",&T);
	while(T--)work();
	return 0;
}