2019 Google Kickstart Round A Solution
A. Training
从N个学生中选出K个,每名学生的能力值$S_i$, 要求选出的P个学生能力值相同。可以通过1h训练提升1名学生的能力值加1,问最少的训练时间。 $N\leq 10^5$
按能力排序,尺取法选出K个学生就AC了。。。。没睡醒,代码有点乱
1 |
|
B. Parcels
一个R*C的网格,已经存在一些办公室,现在再新建一个办公室。一个点的交付时间是到最近办公室的曼哈顿距离。总交付时间是所有点交付时间的最大值。求新建办公室以后,总交付时间最小是多少?
$1 \leq R,C\leq 250$
二分,二分总交付时间,判断当总交付时间位K时,是否存在解
确定总时间后,用BFS扫描一遍图,之后统计没到的点的x+y,以及x-y,维护所有交付时间大于K的点的x+y与x-y最大值与最小值,之后判断差值是否大于K,即是否可以通过建一个办公室来满足要求。
1 |
|
C. Contention
电影院有N个座位,从左到右标号1-N。有Q条预定,每条预定是一个范围$[L_i,R_i]$,这些预定可能存在重复,后面的预定系统只会分配区间内还没占用的座位。你一次只能向系统中输入一条预定,不过你可以改变预定顺序。问最大的K(每条预定都有K个座位被分配)是多少?$N\leq 10^6, Q\leq 30000$
有点懵逼。。。菜
orz。。。发现只有2个大佬过了,这波操作跪了跪了
可以发现第i个预定结果与前i-1个预定的顺序无关,那么我们可以从最后一个预定向前面递推,贪心的选取当前得到座位数最多的booking。
证明: 对于最优解 $q_1,q_2,…,q_i,..q_Q$,对应获得的座位数量为$ans_1,…,ans_Q$ ;如果存在一个booking $q_i$ 放在最后 获得seat $ans_Q’> ans_Q$, 那么可以得到序列$q_1,..,q_{i-1},q_{i+1},..q_Q,q_i$一定要优于最优解,与最优解矛盾。
所以可以用扫描线贪心选取最后预定获得seat最多的booking,时间复杂度为O(Q^2).
显然对于复杂度还是无法通过所有样例,官方说是用间隔树emmmmm。。。(这玩意是啥==),将N个座位切割成一个个不重叠的区间,这里用线段树来维护区间被几个booking预定了,每次取被一个booking覆盖的区间,更新覆盖目前这个booking获得的座位个数,然后将当前最多座位的booking删掉,相当于最后预定这个booking,其实就是把之前找最后一个booking的过程用线段树在logQ时间内完成了。
代码。。咕咕咕。。。