2020.07.27【省选B组】模拟

T1:设f[u]表示从u走到根的最小花费。考虑从上往下转移,当我们要求一个u的f值时,一定是枚举一种过路劵i,然后从与u的距离小于等于k[i]的u的祖先中取min转移。而取min的过程可以用倍增优化。

 

T2:对于左光标左侧和右光标右侧的字符我们可以用两个栈维护,而中间部分则用一个队列维护。在翻转时就对中间的队列打标记,而其他操作推一下就好了。

 

T3:首先观察式子l-(T-t)^2,(l,t<=10^5)发现当两份作业的t只差小于sqrt(10^5)时l是不起作用的。于是我们先按照t、l和编号排序,然后将t相同的放入同一个栈中。每次就只枚举sqrt(10^5)范围内的t,然后在每个t的栈顶中选取最小值。

注意(T-t)^2会爆long long,所以我们要通过类似于斜率优化的方法,通过比较斜率来取最小值。

 

T4:设f[i][j]表示a用到第i位,b用到第j位时的方案数。

若a[i+1]!=b[j+1],那么f[i][j]自然可以转移到f[i+1][j]和f[i][j+1]。

但是如果a[i+1]=b[j+1],那么情况比较复杂。通过进一步分析,我们发现其实我们需要找出从i和j开始连续的一段a等于b的。在加入这两端时我们可以强制每一时刻a的这一段的加入的数量都要比b多,这样可以不算重。接着我们可以假设这一段的长度为s,当a的这一段全部加完时b加了k位,那么就相当于一个包括s个左括号和k个右括号的合法括号序列的方案数,这个可以预处理出来(设为g[s][k])。接下来我们就可以从f[i][j]*g[s][k]转移到f[i+s+1][j+k]。b在a之前加完同理。最终答案等于f[n][n]+f[n][n+1],因为我们还要统计a和b最后的若干位相同的情况。

下面讲一下g的求法。我们可以把问题转化成二维平面上的问题:即从(0,0)走到(i,j),不能走到i

你可能感兴趣的:(【NOIP提高组】模拟A组)