链接: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$三个情况。前两个不必多说,第三个我们也是只需要统计从$\frac{k}{2}$数到$n$有多少个整数就行,因为总有$x<\frac{k}{2}$和它对应。
1 |
|
C:给定长为$n$的合法括号序列,让你求一个长为$k$的合法括号子序列。
维护每一个下标为$i$的左括号对应的右括号下标$to[i]=j$,然后贪心地从左到右扫符合当前长度条件$k≥to[i]-i+1$的括号序列,每找到一堆符合条件的括号序列要更新$k$和$i$。
1 |
|
D:原本有$n$个范围在$[1,q]$的数,定义染色操作$[l_i,r_i]$表示将$[l_i,r_i]$区间内的数字变为$i$,现在给你$n$个染色后的数字作为结果,其中含有数字$0$表示这里可以是任意数字,问你$q$次操作能不能把原本的序列变成这个序列。
考虑到每次染色为一个区间,每个数字$i$仅能染色一次。那么在进行过一次染色操作后,这个区间内的数字必然不能比$i$小。
问题在于如何处理$0$,我们考虑有一个$0$在某个区间$[L,R]$内,且$a_L$与$a_R$相同,$[L,R]$中不存在除了$0$以外小于$a_L$的数字。那么我们可以将这个0置为相邻两侧数字中的任意一个,作为扩展那个数字的区间长度。
因此我们构造时只需要维护每一个数字的最右侧相同的那个数字,整个区间必然会被覆盖一次。然后用线段树维护区间最小值,存在有小于区间端点的数字时必然无法构造。
1 |
|