Kick Start 2019 Round A Contention

$\DeclareMathOperator*{\argmax}{arg\,max}$

题目链接

题目大意

一排 $N$ 个座位,从左到右编号 $1$ 到 $N$ 。

有 $Q$ 个预定座位的请求,第 $i$ 个请求想要预定编号从 $L_i$ 到 $R_i$ 的所有座位。

可以按任意顺序处理这 $Q$ 个请求,处理一个请求时,把对应区间中尚未被分配的座位分配给这个请求。

试问每个请求最终订到的座位数量的最小值最大可能是多少?

Limits

  • Time limit: 30 seconds per test set.
  • Memory limit: 1GB.
  • $T = 100$.
  • $1 \le N \le 10^6$.
  • $1 \le L_i \le R_i \le N $.
  • $1 \le Q \le 30000 $.
  • For at least 85 of the test cases, $Q \le 3000$.

分析

Observation 1: 第 $i$ 个被处理的请求所获得的座位数量与处理前 $i - 1$ 个请求的顺序无关。

Observation 2:
设 $A, B$ 是相邻的两个请求。假设若先处理 $A$,则 $A$ 得到 $a$ 个座位;若先处理 $B$,则 $B$ 得到 $b$ 个座位;又设 $A, B$ 两请求共得到 $c$ 个座位,显然 $c$ 跟 $A, B$ 被处理的先后顺序无关,且有 $a + b \ge c$ 。不妨设 $a > b$ 。若先 $A$ 后 $B$ 则两个请求得到的座位数的最小值为 $\min(a, c - a) = c - a$;若先 $B$ 后 $A$,则最小值为 $\min(b, c - b)$ 。注意到 $b \ge c - a$ 且 $ c - b > c - a $,故有 $\min(b, c - b) \ge \min(a, c - a)$;换言之,对于相邻的两个请求,应当先处理分到座位较少的那个请求。

注意:满足上述条件的处理顺序也许不唯一,因为 $a, b$ 的大小关系依赖于之前处理的那些请求。

到这里我就想不通了。


官方题解

We can observe that for a chosen ordering of the requests, the number of seats that the system books in the last request does not depend on the ordering of the previous $Q - 1$ requests. So, we could start by finding the request to be processed last and move backwards towards the earlier requests.

这一段我能理解,但问题在于 how can you determine which request should be processed last in an optimal solution?


我想通了。

考虑若干个请求的任意排列,按此排列进行操作,把每个请求获得的座位数的最小值简称为此「排列的最小值」。

Key observation:

从任意 $k$($k > 1$)个请求的任意排列中拿走一个请求,余下的 $k - 1$ 请求的排列的最小值一定不小于原先 $k$ 个请求的排列的最小值。

定义函数 $f(x)$ 表示最后(即第 $Q$ 个)处理请求 $x$,$x$ 能得到多少个座位。将 $f(x)$ 的最大值记作 $m$ 。

对于 $Q$ 个请求的任一排列 $P := p_1, p_2, \dots, p_Q$,设其最小值为 $a$ 。
假设 $f(p_Q) < m$,则 $a \le f(p_Q) < m$,又设 $f(p_i) = m$;考虑排列 $P' := p_1, p_2, \dots, p_{i -1}, p_{i + 1}, \dots, p_{Q}$ ,设其最小值为 $b$,于是有 $ b \ge a $ 。

考虑排列 $P'' := p_1, p_2, \dots, p_{i -1}, p_{i + 1}, \dots, p_{Q}, p_i$,设其最小值为 $c$,易见 $ c = \min(b, m)$ 。
由于 $b \ge a$ 且 $ m > a$ 故有 $c \ge a$ 。所以把 $\argmax_x f(x)$ 放最后能导致最优解。

猜你喜欢

转载自www.cnblogs.com/Patt/p/11618433.html
今日推荐