need help
  • 板块P11396 排队
  • 楼主skyx
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/16 10:55
  • 上次更新2025/1/16 11:27:54
查看原帖
need help
1228886
skyx楼主2025/1/16 10:55
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int a[300005],use[300005],id[300005];
set<int> s;
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		s.insert(i);
		use[i]=1;
		id[a[i]]=i;
	}
	while(!s.empty())
	{
		int x = *s.begin(), y = id[x];
		use[y]=0;
		s.erase(x);
		printf("%d ",x);
			if(use[y-1]==0)
			{
				for(int i=y+1;i<=n&&a[i]<a[i-1]&&use[i]==1;i++)
				{
					use[i]=0;
					s.erase(a[i]);
					printf("%d ",a[i]);
				}
			}
			else if(use[y+1]==0)
			{
				for(int i=y-1;i>=1&&a[i]>a[i+1]&&use[i]==1;i--)
				{
					use[i]=0;
					s.erase(a[i]);
					printf("%d ",a[i]);
				}
			}
			else if(use[y-1]==1 && use[y+1]==1)
			{
				
				if(a[y-1]>a[y+1])
				{
					for(int i=y-1;i>=1&&a[i]>a[i+1]&&use[i]==1;i--)
					{
					use[i]=0;
					s.erase(a[i]);
					printf("%d ",a[i]);
					}
				}
				else
				{
					for(int i=y+1;i<=n&&a[i]<a[i-1]&&use[i]==1;i++)
					{
					use[i]=0;
					s.erase(a[i]);
				    printf("%d ",a[i]);
					}
				}
			}
		}
	return 0;
}

在输入

4
2 1 4 3

时,输出

0

写法与以下正解(部分)不同在对 a[y+1] 这一类数据的处理?

if (!vis[y + 1]) { // 只有右面有猫猫
			vis[y + 1] = 1; // 取走啦
			s.erase(a[y + 1]); // 删除啦
			printf("%d ", a[y + 1]); // 进队啦
			for (int i = y + 2; i <= n && a[i] > a[i - 1] && !vis[i]; i++) {
				vis[i] = 1;
				s.erase(a[i]);
				printf("%d ", a[i]);
			} 

在我的代码中,功能一样的部分:

if(use[y-1]==0)
			{
				for(int i=y+1;i<=n&&a[i]<a[i-1]&&use[i]==1;i++)
				{
					use[i]=0;
					s.erase(a[i]);
					printf("%d ",a[i]);
				}
			}

qwq

2025/1/16 10:55
加载中...