Google Kickstart 2019 Round A : Contention
问题
你正在给一个电影院售卖前排座位。假设前排座位有N个座位,从左到右编号1到N。你上个星期不在办公室,而现在回到办公室后发现桌子上已经堆积了Q个购票请求,假设第i
个购票请求是购买从Li
到Ni
(含端点)的所有座位。你现在不得不把这些请求一个个输入到系统中进行座位分配。
由于这些购票请求的座位可能重叠,系统无法完全满足所有的购票请求。当你把一个购票请求输入到系统中时,系统会把该请求想预订的且当前未出售的座位全部分配给该请求。
求解最大的k
,使得存在一种输入购票请求的顺序,在系统处理完所有的请求后,每个请求都至少获得了k
个座位。
输入:
第一行为一个数字T
,代表有T
个测试用例。
接下来是T
个测试,每个测试用例的首行是N
和Q
,代表有N
个座位和Q
个购票请求。后面接着Q
个购票请求的最左端和最右端座位的编号Li
和Ri
。
输出:
对每一个测试用例,输出上面所述的k
。
限制:
1 ≤ L ≤ R ≤ N ≤ 106
1 ≤ Q ≤ 30000
初步思想(官方解析):
The number of possible orderings of the requests is Factorial(Q), which would not be fast enough for either of the test sets. 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. The answer is the minimum seats booked across the Q steps.
Another observation is that at every step, we can always choose this last request greedily from the remaining set: the one where we can book the maximum number of seats. An intuitive proof of why this works would be noticing that our final answer is non-increasing over the Q steps. Now, we can use exchange argument to prove this observation since choosing a request with lesser seats booked would not give us a better answer.
基于如下观察:当我们给第Q
个请求分配座位时,前面的Q-1
个请求已经分配完毕。因此第Q
个请求的座位分配与前面Q-1
请求的 顺序 无关。因此我们可以从确定输入系统的最后一个请求开始往前推,每次确定一个请求,这个请求相比其他未确定的请求能够获得更多的座位,直到确定出第一个请求。为什么这样贪心的做法能够得到最优解?原因在于这样的过程中,k
是非递增的。假使现在我们要确定倒数第Q-m
个请求,按照贪心的思想确定的请求是 Qu
,而最优的方案此时应该选择Qv
,使用A(Qu)
和A(Qv)
来指代这两个请求在当前位置输入购票系统能够获得的座位数,那么应有 A(Qu) > A(Qv)
。若选择Qv
,那么就有k <= A(Qv)
,然而贪心的方法在选择了Qu
之后或许存在一种顺序使得还未确定下的m个请求所能获得的最小座位数比A(Qv)
大,这也就说明当下选择Qv
并不是必要的,因为它不必要地降低了我们所求的k
值。
更直观一点就是,如果把请求Qu
放到第Q-m
个位置就能获得A(Qu)
个座位,现在把这个请求更早地输入系统中,所能获得的座位必定相等或更多,然而这并没有提高我们的座位分配数下界。而若我们把请求Qv
放在第Q-m
个位置,则是鲁莽地刷新了座位分配数的下界,这个下界后续无论怎么优化请求的顺序都无法再提高。
再来考虑如果此时有多个未确定请求,他们若在此位置输入系统都可获得A(Qv)
个座位,那么该在他们之间如何选择?如果他们都能获得A(Qv)
个座位,说明他们与除他们自己外的其他请求相比都有A(Qv)
个不同的座位想预订,那么这时谁先谁后都不会对k
造成影响,因为这几个请求必定能获得等于或大于A(Qv)
个座位!
具体实现待续。