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<j的位置的方案数。于是转移方程就是g[i][j]=g[i-1][j]+g[i][j-1]。这样就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值