2019 Google Kickstart Round B Solution
A. Building Palindromes
给一个长度为N的字符串以及Q次询问,每次询问字符串区间$[L_i,R_i]$中的字符能否重构成一个回文串。$N,Q\leq 10^5$
签到题,字符串中只有大写字母,就存一下第i位之前每个字母的数量,然后计算区间内字母数量能否构成回文就AC了
1 |
|
B. Energy Stones
有N块能量石,每块能量石能量为$E_i$,每秒损失$L_i$能量,吃掉它要花费时间$S_i$。吃能量石时将立即接收到能量石当前的全部能量,无论要花费多长时间来吃他。问可以接收到的最大能量。$N, S_i \leq 100$
首先,将石头按最优解的顺序排序,考虑相邻两块能量石i和i+1,应该满足$S_iL_{i+1}< S_{i+1}L_{i}$,否则与最优解矛盾,交换i和i+1能量更多。所以我们可以按照这个规则对能量石排序,然后dp一下前i块石头在前j秒获得的最大能量,最后复杂度为O(NT), T为总时间。
1 |
|
C. Diverse Subarray
有N个饰品编号1-N,第i种饰品类型为$A_i$,Vanity要取$[l,r]$区间内的饰品,不过当区间内某一类型的饰品数量超过K时,这个类型的饰品将会全部抛弃,求通过选取了l和r来获取最多的饰品数量。$1 \leq N \leq 10^5$
例如 6个饰品,类型为1 1 4 1 4 4, K为2,则最佳选取为[1,4,1,4],获得4个饰品
orz….. 有点说不清,线段树单点维护,以及维护连续区间最优解。
首先我们换个角度,我们可以把编号i以后的同一个类型的前K个饰品看为+1,第k+1个饰品看作-K,K+1之后的看为0,最后表达式为0+0+1+1-2+0+0,也就是求这个表达式的连续最大值。
不过因为要枚举起点,所以需要快速的更新计算结果,用线段树维护,由i到i+1,需要把i位设为0,把i位后面第k个与i位相同类型的饰品设为+1,第K+1个设为-K,更新线段树。
1 |
|