#P6035. Ryoku 的逆序对

Ryoku 的逆序对

题目背景

Ryoku 并不知道这题的背景是什么。

题目描述

Ryoku 有一个正整数 {1,2,,n}\{1,2,\cdots,n\} 的排列 A={ai}A = \{a_i\}

她告诉你一个序列 B={bi}B = \{b_i\},表示对于每个数 aia_i,对于所有 j>ij>ibib_i 个数可以与 aia_i 组成逆序对(逆序对的定义是:满足 i>ji>jai<aja_i < a_j 的一组 (ai,aj)(a_i, a_j) 称作一对逆序对)。

不幸的是,Ryoku 给你的序列 BB 有一些位置污损了,你想知道有多少个可能的排列 AA 能符合条件。

请你输出答案并构造一个字典序最小的排列 AA(对于排列 A={ai}, A={ai}A = \{a_i\},\ A' = \{a'_i\} 若存在某个位置 ii,使得 j<i,aj=aj\forall j < i, a_j = a'_jai<aia_i < a'_i,则 AA 的字典序小于 AA')。

输入格式

输入包含两行。
第一行包含一个整数 nn
第二行包含 nn 个整数,为序列 BB。若给出的 bi=1b_i = -1,则代表这个位置被污损了。

输出格式

输出包含两行。
第一行包含一个整数,为可能的排列 AA 的方案数,对 109+710^9 + 7 取模。
第二行包含 nn 个整数,为字典序最小的符合条件的排列。若第一行答案为 00,则第二行无需输出。

5
0 3 0 0 0
1
1 5 2 3 4
5
0 3 -1 0 0
3
1 5 2 3 4
5
0 3 -1 0 1
0

提示

【样例 1 说明】

对于 55,存在逆序对 (5,2),(5,3),(5,4)(5,2),(5,3),(5,4) 共三对。

【样例 2 说明】

符合条件的排列有:$\{1, 5, 4, 2, 3\}, \{1, 5, 3, 2, 4\}, \{1, 5, 2, 3, 4\}$。共三种,其中字典序最小的为 {1,5,2,3,4}\{1, 5, 2, 3, 4\}


【数据规模与约定】

对于 10%10\% 的数据,bi1b_i \neq -1
对于另外 10%10\% 的数据,n10n \le 10
对于另外 10%10\% 的数据,bi=1b_i = -1
对于另外 30%30\% 的数据,n103n \le 10^3
对于另外 30%30\% 的数据,n105n \le 10^5
对于 100%100\% 的数据,0<n1060< n \le 10^61bin-1 \le b_i \le n