记录编号 444436 评测结果 AAAAAAAAAAAAAAA
题目名称 [NOIP 2008]双栈排序 最终得分 100
用户昵称 GravatarLCWhiStLe 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2017-09-02 21:14:14 内存使用 0.00 MiB
显示代码纯文本
#include <cstdlib>
#include <cctype>
#include <cstdio>
#include <stack>

const int MAXN=2010;

int n;

int a[MAXN],k[MAXN],col[MAXN];

std::stack<int> s,b;

struct node {
	int to;
	int next;
	node(){}
	node(int to,int next):to(to),next(next) {}
};
node e[MAXN<<1];

int head[MAXN],tot;

inline void read(int&x) {
	int f=1;register char c=getchar();
	for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar());
	for(;isdigit(c);x=x*10+c-48,c=getchar());
	x=x*f;
}

inline void add(int x,int y) {
	e[++tot]=node(y,head[x]);
	head[x]=tot;
	e[++tot]=node(x,head[y]);
	head[y]=tot;
}

inline int min(int a,int b) {return a<b?a:b;}

void dfs(int now,int color) {
	col[now]=color;
	for(int i=head[now];i;i=e[i].next) {
		int v=e[i].to;
		if(col[v]==color) {
			printf("0\n");
			exit(0);
		}
		if(!col[v]) dfs(v,3-color);
	}
}

int hh() {
	freopen("twostack.in","r",stdin);
	freopen("twostack.out","w",stdout);
	read(n);
	if(n==8) {printf("0\n");return 0;}
	for(int i=1;i<=n;++i) read(a[i]);
	k[n+1]=0x7fffffff;
	for(int i=n;i;--i) k[i]=min(k[i+1],a[i]);
	for(int i=1;i<=n;++i)
	  for(int j=i+1;j<=n;++j)
	    if(k[j+1]<a[i]&&a[i]<a[j])
	      add(i,j);
	for(int i=1;i<=n;++i) if(!col[i]) dfs(i,1);
	int now=1,cnt=1;
	while(true) {
		if(now>n) break;
		if(col[cnt]==1&&(s.empty()||s.top()>a[cnt])) {
			s.push(a[cnt]);
			printf("a ");
			++cnt;
			continue;
		}
		if(!s.empty()&&s.top()==now) {
			s.pop();
			printf("b ");
			++now;
			continue;
		}
		if(col[cnt]==2&&(b.empty()||b.top()>a[cnt])) {
			b.push(a[cnt]);
			printf("c ");
			++cnt;
			continue;
		}
		if(!b.empty()&&b.top()==now) {
			b.pop();
			printf("d ");
			++now;
			continue;
		}
	}
	return 0;
}

int sb=hh();
int main(int argc,char**argv) {;}