【CF392D】Three Arrays 题解

来源:互联网 发布:京东秒杀抢购软件 编辑:程序博客网 时间:2024/06/05 21:03

题目大意

      有三个数组 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 维护最优折点。

0 0