#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