#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>i 有 bib_i 个数可以与 aia_i 组成逆序对(逆序对的定义是:满足 i>ji>j 且 ai<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'_j 且 ai<ai′a_i < a'_i,则 AA 的字典序小于 A′A')。

输入格式

输入包含两行。
第一行包含一个整数 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\% 的数据,bi≠−1b_i \neq -1。
对于另外 10%10\% 的数据,n≤10n \le 10。
对于另外 10%10\% 的数据,bi=−1b_i = -1。
对于另外 30%30\% 的数据,n≤103n \le 10^3。
对于另外 30%30\% 的数据,n≤105n \le 10^5。
对于 100%100\% 的数据,0<n≤1060< n \le 10^6,−1≤bi≤n-1 \le b_i \le n。