You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.5 KiB
C++
55 lines
1.5 KiB
C++
#include <cstdio>
|
|
#include <cstring>
|
|
#include <cstdlib>
|
|
inline int min(int a,int b)
|
|
{
|
|
return a<b?a:b;
|
|
}
|
|
struct
|
|
{
|
|
int data[1001],ite;
|
|
} sta,stb;
|
|
typedef struct Edge
|
|
{
|
|
int from,to;
|
|
Edge* next;
|
|
Edge(int f,int t,Edge* n):from(f),to(t),next(n) {}
|
|
}*lpEdge;
|
|
lpEdge G[1001];
|
|
#define addEdge(x,y) G[(x)]=new Edge((x),(y),G[(x)])
|
|
int a[1001],n,S[1001],col[1001];
|
|
void color(int v)
|
|
{
|
|
for(lpEdge cur=G[v]; cur; cur=cur->next)
|
|
if(col[cur->to]==col[v]) putchar('0'),exit(0);
|
|
else if(col[cur->to]==-1) col[cur->to]=col[v]^1,color(cur->to);
|
|
}
|
|
int main()
|
|
{
|
|
memset(&sta,0,sizeof(sta));
|
|
memset(&stb,0,sizeof(stb));
|
|
memset(col,-1,sizeof(col));
|
|
scanf("%d",&n);
|
|
for(int i=0; i<n; i++)
|
|
scanf("%d",a+i);
|
|
S[n]=0x3f3f3f3f;
|
|
for(int i=n-1; i>=0; i--) S[i]=min(a[i],S[i+1]);
|
|
for(int i=0; i<n; i++)
|
|
for(int j=i+1; j<n; j++)
|
|
if(a[i]<a[j]&&S[j+1]<a[i])
|
|
addEdge(i,j),addEdge(j,i);
|
|
for(int i=0; i<n; i++)
|
|
if(col[i]==-1) col[i]=0,color(i);
|
|
for(int i=0,next=1; i<n; i++)
|
|
{
|
|
if(col[i]==0) sta.data[sta.ite++]=a[i],printf("a ");
|
|
else stb.data[stb.ite++]=a[i],printf("c ");
|
|
while(sta.data[sta.ite-1]==next||stb.data[stb.ite-1]==next)
|
|
{
|
|
if(sta.data[sta.ite-1]==next) sta.ite--,printf("b "),next++;
|
|
if(stb.data[stb.ite-1]==next) stb.ite--,printf("d "),next++;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|