题目
题目地址:https://gmoj.net/senior/#main/show/6652
题目大意:
给你 n n n 个 1.. m 1..m 1..m 的排列,对于每一个排列,你都可以从前往后将元素依次插入一个队列中(要么放到队列头,要么放在队列尾)。问有多少种队列是这 n n n 个排列都可以到达的,并要求给出这些队列中字典序最小的那一个。
n ≤ 1000 , ∑ m ≤ 5000 n\le 1000,\sum m\le 5000 n≤1000,∑m≤5000
题解
这题不能用 D P DP DP 之类的算法来处理。
发现每个排列的第 m m m 个元素必定在所得队列的头或者尾处,因此考虑倒着求这个队列,这是一个从队列的两端向中间填数字的过程。
假设现在处理到第 k k k 个元素,第 i i i 个排列完成了队列的 1.. x i − 1 1..x_i-1 1..xi−1 及 y i + 1.. m y_i+1..m yi+1..m 的部分(即现在要在 x i x_i xi 和 y i y_i yi 上填数字)。
令 l = max x i , r = min y i l=\max x_i,r=\min y_i l=maxxi,r=minyi 。
如下图:
由于要求队列是可以由每一行得到的, 1.. l 1..l 1..l 和 r . . m r..m r..m 上的数字已经被固定了,令 s i s_i si 表示队列上第 i i i 位的数字。
对于第 i i i 个序列,分类讨论:
- 若 x i < l , 且 y i > r x_i<l,\text{且} y_i>r xi<l,且yi>r ,就看 a i , k a_{i,k} ai,k 与 s x i , s y i s_{x_i},s_{y_i} sxi,syi