luogu#P11515. [CCO 2024] Pizza Party

[CCO 2024] Pizza Party

题目背景

翻译自 CCO2024P2题

题目描述

Troy 正在完善他最新的计划——“HackCCO”!大家都知道,黑客马拉松最大的吸引力就是免费的食物。因此,为了确保“HackCCO”取得空前的成功,Troy 订购了一辆装满 nn 份披萨的大车,其中从车的顶部往下数第 ii 份披萨的风味是 aia_i

披萨车到达后,Troy 需要将它们按照一定的数量堆放在一张长桌上。为此,他从车顶部逐个取下披萨,并将它们放在桌上,每次要么将披萨放在另一堆披萨的顶部,要么在桌上形成新的堆叠。

饥饿的 HackCCO 参与者们排成一排,依次从桌上取披萨。特洛伊知道队伍中第 ii 个人最喜欢的披萨口味是 bib_i。当第 ii 个人走到餐桌前时,如果他们在任何一堆顶部看到他们喜欢的口味的比萨,他们会随机拿走其中任意一个。否则,他们什么都不会拿,会饿着肚子离开餐桌。

Troy 不想让任何人饿着离开餐桌。因此,他请你帮助他找到一种将比萨放在餐桌上的排列方式,使得没有人会饿着离开。此外,在所有这样的排列方式中,Troy 想让你找到一个在餐桌上创建最小数量的堆放的排列方式(毕竟,餐桌只能这么长)。帮助他找到这样的排列方式,或者确定这是不可能的!

输入格式

第一行一个正整数 nn

第二行 nn 个正整数 a1,a2,,ana_1, a _ 2, \ldots, a _ n

第三行 nn 个正整数 b1,b2,,bnb _ 1, b _ 2, \ldots, b _ n

输出格式

如果不可能按期望来排列披萨,则输出 -1

否则,输出应该由三行组成。在第一行输出一个整数 KK,表示最小堆数。在第二行输出 NN 个空格分隔的整数 c1cnc_1 \sim c_n1cik1\le c_i \le k),表示第 ii 个披萨应该放在第 cic_i 堆上。

在第三行输出 NN 个空格分隔的整数 d1dNd_1\sim d_N1diK1\le d_i\le K),表示第 ii 个排队的人从第 did_i 堆里拿披萨。第 ii 个人拿的披萨需要满足他们的口味需求。

7
1 2 3 2 2 1 3
2 3 1 2 3 2 1
2
1 2 1 2 1 2 2
1 2 2 2 1 2 1
2
1 2
1 1

-1

提示

数据范围

Subtask 分数 约束
Subtask 11 1212 1n1061 \le n \le 10^61ai,bi21 \le a_i,b_i \le 2
Subtask 22 1616 1n50001\le n \le 5000,保证 aia_i 互不相同
Subtask 33 2020 1n1061 \le n \le 10^6,保证 aia_i 互不相同
Subtask 44 2424 1n50001\le n \le 5000
Subtask 55 2828 1n1061 \le n \le 10^6

说明

出题人表明原题中的 Subtask 44 和 Subtask 55 可能没有正确解法,故不对 Subtask 44 和 Subtask 55 进行评测,故该题满分为 4848 分。

Subtask 00 为样例。

样例解释 #1

上图是桌子上披萨的排列示意图,红色、黄色、蓝色盒子分别代表口味 112233 的披萨。