社区讨论

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 条回复,欢迎继续交流。

正在加载回复...