社区讨论
WA on #11 #13
P1155[NOIP 2008 提高组] 双栈排序参与者 4已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @lo1bvecs
- 此快照首次捕获于
- 2023/10/22 18:30 2 年前
- 此快照最后确认于
- 2023/11/02 18:52 2 年前
求助。
CPP#include<cstdio>
#include<iostream>
#include<cstring>
#include<stack>
#define int long long
using namespace std;
const int N=1e3+10;
int n,a[N],suf[N],cnt=1;
struct Edge{
int v,nxt;
}e[N*N];
int h[N],tot;
void add(int u,int v)
{
e[++tot].v=v;
e[tot].nxt=h[u];
h[u]=tot;
}
int col[N];
stack<int>s1,s2;
int f=0;
void dfs(int u)
{
for (int i=h[u];i;i=e[i].nxt)
{
int v=e[i].v;
if (col[v]&&col[v]==col[u])
{
f=1;
return;
}
if (!col[v])
{
col[v]=col[u]*-1;
dfs(v);
}
}
}
signed main()
{
// freopen("P1155_11.in","r",stdin);
scanf("%lld",&n);
for (int i=1;i<=n;i++) scanf("%lld",a+i);
suf[n+1]=1145141919810;
for (int i=n;i>=1;i--) suf[i]=min(a[i],suf[i+1]);
for (int i=1;i<=n;i++)
{
for (int j=i+1;j<=n;j++)
{
if (a[i]<a[j]&&a[i]>suf[j+1]) add(i,j),add(j,i);
}
}
// for (int i=1;i<=n;i++) printf("%lld ",suf[i]);
for (int i=1;i<=n;i++)
{
if (!col[i])
{
col[i]=1;
dfs(i);
}
}
if (f)
{
printf("0\n");
return 0;
}
for (int i=1;i<=n;++i)
{
if (col[i]==1)
{
s1.push(a[i]);
printf("a ");
}
while (!s1.empty()&&s1.top()==cnt)
{
s1.pop();
printf("b ");
cnt++;
}
if (col[i]==-1)
{
s2.push(a[i]);
printf("c ");
}
while (!s2.empty()&&s2.top()==cnt)
{
while (!s1.empty()&&s1.top()==cnt)
{
s1.pop();
printf("b ");
cnt++;
}
printf("d ");
s2.pop();
cnt++;
}
}
while (!s1.empty()&&!s2.empty())
{
int d1=s1.top(),d2=s2.top();
if (d1>d2)
{
printf("b ");
s1.pop();
}
else
{
printf("d ");
s2.pop();
}
}
while (!s1.empty())
{
printf("b ");
s1.pop();
}
while (!s2.empty())
{
printf("d ");
s2.pop();
}
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...