链接:http://codeforces.com/contest/1023
我,七夕,掉分
A:两个字符串,其中一个字符串里至多有个“*”表示任何字符都能匹配。问这两个字符串能不能匹配。
从左到右扫两个字符串的相同前缀和后缀,然后看看是不是存在“*”以及两头不相接。据说这题被cha得很厉害啊?
1 |
|
B:给你两个数n和k,问你k有多少能用不超过n的两个不同的数的和来表示,忽略顺序。
设k=x+y,要满足x≤n、y≤n和x≠y。我们会发现,需要讨论k≥2n、k≤n和n<k<2n三个情况。前两个不必多说,第三个我们也是只需要统计从k2数到n有多少个整数就行,因为总有x<k2和它对应。
1 |
|
C:给定长为n的合法括号序列,让你求一个长为k的合法括号子序列。
维护每一个下标为i的左括号对应的右括号下标to[i]=j,然后贪心地从左到右扫符合当前长度条件k≥to[i]−i+1的括号序列,每找到一堆符合条件的括号序列要更新k和i。
1 |
|
D:原本有n个范围在[1,q]的数,定义染色操作[li,ri]表示将[li,ri]区间内的数字变为i,现在给你n个染色后的数字作为结果,其中含有数字0表示这里可以是任意数字,问你q次操作能不能把原本的序列变成这个序列。
考虑到每次染色为一个区间,每个数字i仅能染色一次。那么在进行过一次染色操作后,这个区间内的数字必然不能比i小。
问题在于如何处理0,我们考虑有一个0在某个区间[L,R]内,且aL与aR相同,[L,R]中不存在除了0以外小于aL的数字。那么我们可以将这个0置为相邻两侧数字中的任意一个,作为扩展那个数字的区间长度。
因此我们构造时只需要维护每一个数字的最右侧相同的那个数字,整个区间必然会被覆盖一次。然后用线段树维护区间最小值,存在有小于区间端点的数字时必然无法构造。
1 |
|
v1.5.2