python
2026-05-16 18:28:29
发布于:江苏
2阅读
0回复
0点赞
n = int(input())
p = list(map(int, input().split()))
# 预处理后缀最小值
suf_min = [0] * (n + 1)
suf_min[n] = float('inf')
for i in range(n - 1, -1, -1):
suf_min[i] = min(p[i], suf_min[i + 1])
# 构建冲突图,判断哪些数不能去同一个栈
# 如果 i<j<k 且 p_k < p_i < p_j,则 i 和 j 不能去同一个栈
color = [-1] * n # -1未染色,0去S1,1去S2
G = [[] for _ in range(n)]
for i in range(n):
for j in range(i + 1, n):
if p[i] < p[j] and suf_min[j + 1] < p[i]:
# 存在 k>j 使得 p_k < p_i < p_j
G[i].append(j)
G[j].append(i)
# 二分图染色
def dfs(u, c):
color[u] = c
for v in G[u]:
if color[v] == -1:
if not dfs(v, c ^ 1):
return False
elif color[v] == c:
return False
return True
for i in range(n):
if color[i] == -1:
if not dfs(i, 0):
print(0)
exit()
# 模拟双栈排序,输出字典序最小的操作序列
stack1 = []
stack2 = []
ans = []
cur = 1 # 当前期望输出的数字
for i in range(n):
# 优先使用栈1(操作a)
while True:
if stack1 and stack1[-1] == cur:
ans.append('b')
stack1.pop()
cur += 1
elif stack2 and stack2[-1] == cur:
ans.append('d')
stack2.pop()
cur += 1
else:
break
# 判断当前数字应该去哪个栈
if color[i] == 0:
# 去栈1,但要确保栈是递增的(栈顶最小)
while stack1 and p[i] > stack1[-1]:
# 冲突,尝试用栈2弹出
if stack2 and stack2[-1] == cur:
ans.append('d')
stack2.pop()
cur += 1
else:
break
ans.append('a')
stack1.append(p[i])
else:
# 去栈2,同样确保栈是递增的
while stack2 and p[i] > stack2[-1]:
if stack1 and stack1[-1] == cur:
ans.append('b')
stack1.pop()
cur += 1
else:
break
ans.append('c')
stack2.append(p[i])
# 弹出剩余元素
while cur <= n:
if stack1 and stack1[-1] == cur:
ans.append('b')
stack1.pop()
cur += 1
elif stack2 and stack2[-1] == cur:
ans.append('d')
stack2.pop()
cur += 1
else:
break
print(' '.join(ans))
这里空空如也

有帮助,赞一个