Educational Codeforces Round 89 题解

昨晚简单 vp 了场比赛找了找状态,切了 5 个题(有一个差点调出来),rk57,还算理想吧,毕竟我已经好久没碰过电脑了(

A

签到题不多说,直接输出 (min{a,b,dfrac{a+b}{3}}) 即可

B

对于每次操作维护一个区间 ([l,r]) 表示有可能是 (1) 的位置组成的集合(显然是一个区间),初始 (l=r=x),每次操作如果 ([l,r]) 和操作的区间有交那么取个并即可,复杂度线性

C

开个桶记录下到 ((1,1)) 距离为 (1,2,3,cdots,n+m-1) 的点中分别有多少个 (0,1),然后在对称的位置里面取 (min) 相加即可,复杂度线性

D

如果 (n) 可以表示成 (p^{alpha}) 的形式,其中 (p) 是质数,(alpha) 是整数,那么答案就是 (-1),否则记 (mnp_x)(x) 的最小质因子,(eta)(mnp_n)(n) 的质因数分解形式中的最大因子,那么 (dfrac{n}{p^{eta}},mnp_{dfrac{n}{p^{eta}}}) 符合条件

E

对于每一段二分找出这一段可能的左端点、右端点,然后乘法原理乘起来即可,二分检验可用 ST 表

F

这道题还蛮有意思的,比赛最后几分钟肝出来了,却因为爆 int 一直 WA 8,赛后 2min 把它 A 掉了……
首先注意到图中每个简单路径的长度都 (le m),因此当 (k) 比较大((>m))组成的路径肯定不是简单路径,故不难猜出当 (k) 比较大时最优方案是先走到某条边 (e) 的一个端点处,然后在这条边上来回走动,在这种情况下每过一秒经过的长度 (Delta l) 都等于这条边的边权 (w),因此这条边经过的路径长度可以写成一个与时间 (t) 有关的一次函数 (y=wt+b(tge t_0)),其中 (t_0) 为到达这条边的时间。
受到这个思想的启发,我们可以先暴力 (dp) 求出当 (kle m) 时以每个点结束的最短路径,这部分的贡献我们特殊处理一下,特判掉。对于 (k>m) 的部分我们就暴力枚举是哪条边,以及到达这条边的时间 (t_0),这样有 (n^2) 条直线(或者准确来说,是一条射线),求出它们的凸壳即可,复杂度 (n^2log n) 可以通过。当然这里也有一个非常 trival 的优化,不难发现同一条边,对于不同的 (t_0),它们表示的直线的斜率是相同的,我们只需保留截距最大的那条即可。这样建凸包的时间可以降到 (nlog n),总复杂度 (nm+nlog n)

G

这道题倒感觉不如 F 有意思,虽然我现场并没有想到正解,可能是我 (dp) 太菜了吧
一个很显然的思路是设 (dp_{i,j}) 表示考虑了前 (i) 位,现在匹配到第 (j) 位的最小删除字符个数。这一步我倒是想到了,然鹅我只想到了线性的转移,看来还是 wtcl 了啊……
事实上这个状态可以实现 (mathcal O(1)) 转移:

  • (dp_{i+1,j}leftarrow dp_{i,j}+1)
  • (dp_{i+1,j+1}leftarrow dp_{i,j}(s_{i+1}=t_{j+1}))
  • (dp_{nxt_i,j}leftarrow dp_{i,j})(其中 (nxt_i) 为从 (i) 开始,如果把小写字母当作左括号,点当作右括号,第一个达到括号平衡的位置)

时空复杂度均平方。

原文地址:https://www.cnblogs.com/ET2006/p/codeforces-1366.html