A. Regular Bracket Sequence
注意到题目保证只有一个左括号和一个右括号。
所以只有字符串长度为奇数,或者(s_1)是)
或者(s_n)是(
时,才无解。
B. Red and Blue
因为(r)和(b)中的元素时保留原数组中的顺序的。而且题目只关注前缀和的最大值,而根据前面的条件,原数组中的前缀必定是(r)的一段前缀和(b)的一段前缀中的元素组成。直接(O(nm))枚举一下,取最大值就好了。
C. Building a Fence
模拟。细节出锅,直接卡题自闭下分。
如果块在(i)处可放置的范围已经确定,那么块在(i+1)处可放置的范围也能求出来,而第一块的放置范围是已知的,所以可以从左到右依次放置,每次判断在当前范围内是否有满足要求的放置方法。
假设(i)处的可放置范围为([low, high])。其中(low)表示块的底部最低可以到多少,(high)表示块的顶部最高可以到多少。
因为块和前一个块至少有1单位的相交以及块不能插入地面,所以(low_{i + 1} = max(h_i, low_i + 1 - k))。
因为块和前一个块至少有1单位的相交以及块不能离地超过(k - 1),所以(high_{i +1} = min(h_i + k - 1 + k, high - 1 + k))。
然后对于(2 le i < n),有可行解的条件就是不能插入地面且不能离地过高,即要满足(h_i le high_i - k)且(low_i <= h_i + k - 1)。对于最后一块,有可行解的条件是刚好在地表且不能插入地卖弄,即要满足(h_i le high_i - k)且(low le h_i)。
D. Ceil Divisions
第一个想法应该都是保留(2)和(n)吧,然后最后再不断使用操作n 2
,但是这种方法在(n)大的时候会超出次数限制。
但是保留(n)这个思路应该是没错的,接下来想到要找到另外一个数(r)保留,让(n)和(r)操作,快速让(n)的变到(1),然后再用(2)把(r)搞到(1)。然后就想到了用(r = lceil sqrt n
ceil)。先将除了(1),(2),(r)以及(n)以外的数都与(n)操作,花费(n - 4)次操作。现在,两遍n r
之后,出了(2)和(r)以外都是(1)了。最后再用(2)去把(r)搞成(1)。这样(r)的上限大概是在(450)左右,好像差不多卡进去了。但是这个方法在(n = 2 imes 10^5)时会稍微超限几步。
然后,就想到了继续用这个方法取优化。大概就是再用一个(r^prime = lceil sqrt r ceil),在用(r)把(n)搞到(1)之后,再用(r^prime)把(r)搞到1,最后再用(2)把(r^prime)搞到(1)。现在足够优秀了。
E. A Bit Similar
比赛的时候看错题了,然后就去看F了。事实上这题挺水的。
性质
一个(n)位二进制串(a),将其按位取反后得到串(b),串(b)和除了(a)之外的所有(n)位二进制串都至少有一个位相同。
解法
根据题意,最后的结果为一个(k)位二进制串,再结合前面的性质,可以推出则当(2^k ge 2e5)的时候,必定有解。特别的,当(2^x ge 2e5)时,最后结果的前(k - x)位都可以为0。
所以就可以枚举(x),至多枚举(max(n, log_2 k))次,就能找到结果或者得出无解的结论。
现在(x)就相当于常数了,然后前(k - x)位都是0
,这个就可以匹配出一些串了。再枚举未匹配的串,把后(x)位标记一下。最后再枚举([0,2^x)),若这个解可行,就可以得到答案了。
F. Power Sockets
卡简单题+手速不够。
先放长的会比先放短的更优。
每次尽量对半,拿中间的点去和离根最近的白点连接。这样会比其他的方法更优。
每次加完后,离根第k近的白点深度可能会变化,那么就需要更新答案为两者中的较小值。
然后就是用一个线段树来模拟这个过程。大概就是用线段树(s_i)来记录深度为(i)的点的个数。每次就是单点减法(边的端点变黑),区间加法(新加入的白点)以及第一个满足(sum(0, i) ge k)的(i)。
前两个操作是线段树入门,最后一个是线段树上二分。