题目大意
有三个数组 A、B、C,大小都为 n。
设三个整数 a、b、c,使得数组中出现过的每个数在 A 的前 a 项、B 的前 b 项、C 的前 c 项至少出现一次。求最小的 a+b+c。
n<=1e5
关于题面
英语渣看到 either or,觉得是每种数字只能出现在一个数组中。。。
直到扒了几份 AC 代码下来跑才知道是可以出现在多个数组中。。。
题解
枚举 a,想办法快速确定 b、c。
这时我们知道了一些数必须在 B、C 中出现。设这个数在 B 中第一次出现的位置是 pb,在 C 中第一次出现的位置是 pc。把 (pb, pc) 看作平面的一个点,那么我们要选的 b、c,就要满足 b>pb 或 c>pc,因此 (b, c) 一定在如下图所示的水平或垂直的折线上或者折线外:
并且可以知道最优点一定可以在折点中找到。
于是用 set 维护折线,用 heap 维护最优折点。