Codeforces #344 Div.2

Codeforces #344 Div.2

Interview

题目描述:求两个序列的子序列或操作的和的最大值

solution
签到题

时间复杂度:\(O(n^2)\)

题目描述:有一个棋盘,对其进行染色,每次染一行或一列,后来的颜色会覆盖原来的颜色,输出最后的棋盘。

solution
题解用二维线段树,其实可以不用。
对染色进行离线操作,那么染过的格子、行、列就不用再染了。所以每个格子可以记录四个指针,分别是行前驱,行后继,列前驱列后继,染色时按照这个跳着来染就好了。

时间复杂度:\(O(\alpha(nm) nm)\)

Report

题目描述:给出一个序列,操作为选定一个位置\(i\),然后把序列前\(i\)个数按升序或降序排列,输出最后的序列

solution
经观察可得,对于先后两个操作,如果后者的\(i\)大于前者的,则相当于前者没有操作。所以可以对操作进行删减,使得操作的范围是递减的,然后用线段树维护最大最小值即可。

时间复杂度:\(O(nlogn)\)

Messenger

题目描述:一个字符串将以若干个字符区间的形式给出:\((s, ch)\),表示该区间为\(s\)\(ch\)字符组成,然后把这些区间连起来就是完整的字符串。给出两个这样的字符串,问二串在一串中的出现次数。

solution
先将相邻的同字符区间进行合并,假设二串有\(m\)个区间,那么第\(2\)个区间到第\(m-1\)个区间一定要与一串区间一一对应,区间\(1\)\(m\)可以只匹配一串的区间的一部分。那么就相等于把区间\(2\)到区间\(m-1\)看成一个新串,然后做KMP,算答案时判断头尾是否可行就可以了。
要特判\(m=1,2\)的情况。

时间复杂度:\(O(n)\)

Product Sum

题目描述:给出一个序列,序列的值为\(\sum_{i=1}^{n} a_i \cdot i\),现将一个数取出,然后任意找一个地方放回,只能操作一次,为序列的值的最大值。

solution
我们可以求修改之后的序列的值与原序列的值的差。
对于区间\([L, R]\),如果把\(a_L\)放到位置\(R\)则差为(\(sum\)为前缀和)
\(sum_L-a_L \cdot L + a_L \cdot R -sum_R\)
如果把\(a_R\)放到位置\(L\)则差为
\(sum_{R-1}-a_R \cdot R + a_R \cdot L -sum_{L-1}\)

枚举左端点或右端点,式子的前两项为定值,后两项可看成是直线,那么就可以用线段树维护凸壳。

时间复杂度:\(O(nlogn)\)

posted @ 2016-03-16 20:51  GerynOhenz  阅读(194)  评论(0编辑  收藏  举报