记录编号 | 193130 | 评测结果 | AAAAAAAAAAAAAAA | ||
---|---|---|---|---|---|
题目名称 | [NOIP 2008]双栈排序 | 最终得分 | 100 | ||
用户昵称 | 是否通过 | 通过 | |||
代码语言 | C++ | 运行时间 | 0.009 s | ||
提交时间 | 2015-10-13 21:52:52 | 内存使用 | 0.88 MiB | ||
#include<cstdio> #include<deque> #include<cstring> #include<iostream> #include<cmath> using namespace std; const int SIZEN=1010,maxn=0x7fffffff/2; int N,tot=0,now=1; int p[SIZEN],F[SIZEN]={0},co[SIZEN],ok=0; char ans[3*SIZEN]; deque<int> s[SIZEN],A,B; void read() { scanf("%d",&N); for(int i=1;i<=N;i++) scanf("%d",&p[i]); } void add(int fr,int to) { s[fr].push_back(to); s[to].push_back(fr); } bool dfs1(int x,int c) { co[x]=c; for(int i=0;i<s[x].size();i++) { int v=s[x][i]; if(co[v]!=-1&&co[v]==c) return 0; if(co[v]==-1) if(!dfs1(v,c^1)) return 0; } return 1; } void noans() { printf("0\n"); ok=1; return; } void dfs(int x,int t) { if(ok==1) return; co[x]=t; for(int i=0;i<s[x].size();i++) { int v=s[x][i]; if(ok==1) return; if(co[v]==t) { noans();return;} if(ok==1) return; if(co[v]==-1) dfs(v,t^1); } } void makegragh() { F[N+1]=maxn; for(int i=N;i>=1;i--) F[i]=min(p[i],F[i+1]); for(int i=1;i<=N;i++) { for(int j=i+1;j<=N;j++) if(F[j+1]<p[i]&&p[i]<p[j]) add(i,j); } memset(co,-1,sizeof(co)); for(int i=1;i<=N;i++) { if(co[i]==-1) dfs(i,0); if(ok==1) return; } for(int i=1;i<=N;i++) { if(co[i]==0||co[i]==-1) A.push_back(p[i]),ans[tot++]='a'; else if(co[i]==1) B.push_back(p[i]),ans[tot++]='c'; int ok=0; do { ok=0; if(!A.empty()&&A.back()==now) {A.pop_back();ans[tot++]='b';now++;ok=1;} else if(!B.empty()&&B.back()==now) {B.pop_back();ans[tot++]='d';now++;ok=1;} }while(ok==1); } for(int i=0;i<tot;i++) printf(" %c",ans[i]); } int main() { freopen("twostack.in","r",stdin); freopen("twostack.out","w",stdout); read(); makegragh(); return 0; }