28分求调
  • 板块P11396 排队
  • 楼主10806591ll
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/17 16:21
  • 上次更新2024/12/17 20:24:41
查看原帖
28分求调
398177
10806591ll楼主2024/12/17 16:21
#include<bits/stdc++.h>
using namespace std;
/*
pi+1>pi,则pi+1与pi为一组
向两边延伸, pi-1>pi+1,则pi-1与pi为一组

每一次找到当前最小的还没有输出的数,判断它的左右没有选过的二数哪个大,
朝那个方向选单调递增的数列,一旦不满足条件,终止,回到开始。
*/
int n,p[300005],num[300005],q[300005];
bool flag[300005];
int main() {
	cin>>n;
	for(int i=1; i<=n; i++) {
		cin>>p[i];//1-n中的一个
		num[p[i]]=i;//出现的位置
	}
	int cnt=num[1];
	int count=1;//记录当前确定到第几个q了 
	for(int i=1; i<=n; i++) {
		if(!flag[i]){
			q[count++]=i;
			cnt=num[i];//下标 
			flag[i]=true;
		}
		if(p[cnt+1]>p[cnt-1] && !flag[p[cnt+1]]) { //往右走
			q[count++]=p[cnt+1];
			flag[p[cnt+1]]=true;
			cnt=cnt+1;
			while(p[cnt+1]>p[cnt] && !flag[p[cnt+1]]){
				q[count++]=p[cnt+1];
				flag[p[cnt+1]]=true;
				cnt=cnt+1;
			}
		} else if(p[cnt+1]<p[cnt-1] && !flag[p[cnt-1]]) { //往左走
			q[count++]=p[cnt-1];
			flag[p[cnt-1]]=true;
			cnt=cnt-1;
			while(p[cnt-1]>p[cnt]&& !flag[p[cnt-1]]){
				q[count++]=p[cnt-1];
				flag[p[cnt-1]]=true;
				cnt=cnt-1;
			}
		}
	}
	for(int i=1;i<=n;i++)cout<<q[i]<<" ";
	return 0;
}
2024/12/17 16:21
加载中...