AtCoder Beginner Contest 215 - ABC215

AtCoder Beginner Contest 215

E - Chain Contestant

题意

给出一个由 1010 种大写字母 AJA\sim J 组成的字符串 SS,长度为 NN,求 SS 有多少个下标序列满足下列条件:

令下标序列所对应的 SS 的子序列为 TT,满足同一种字母在 TT 中都是连续出现的,如:AAABBCCC 满足条件,但 AABBACCC 就不满足条件,因为字母 A 不连续。

数据范围:N1000N\leqslant 1000

思路

看到字母的类型只有10种,而且每一个状态下要保证之前没有出现过该数字,所以可以用dp的一维保存之前出现过的数字,由于最后一位是可以连续的,所以dp还有一维存储最后一位的数字。

先将字母对应成数字 090\sim9

f(i,j,U)f(i, j, U),表示前 ii 个字符组成的子序列中,最后一位为 jj,且使用子序列中包含了集合 UU 中的数字。

Si=xS_i=x,则有如下转移:

  • f(i,j,U)=f(i1,j,U)f(i, j, U) = f(i-1, j, U) 代表第 ii 位不取。

  • f(i,x,U)+=f(i1,x,U)f(i, x, U) += f(i-1, x, U) 代表取第 ii 位,且是上一位取值也是 xx

  • f(i,x,V{x})+=f(i1,j,V),(x∉V)f(i, x, V\cup\{x\}) += f(i-1, j, V), (x\not\in V) 代表取第 ii 位,且是第一次取 xx

  • f(i,x,{x})+=1f(i, x, \{x\}) += 1 代表只取第 ii 位。

则,ANS=j,Uf(N,j,U)\displaystyle \text{ANS} = \sum_{\forall j, U} f(N, j, U)

总复杂度 O(10×210×N)O(10\times2^{10}\times N)

由于dp的第一维可以滚掉,所以就少开了一维。

F - Dist Max 2

题意

给出 NN 个二维坐标 (xi,yi)(x_i, y_i),定义两个点 i,ji, j 的距离为 min(xixj,yiyj)\min(|x_i-x_j|, |y_i-y_j|)

(切比雪夫距离是取 max\max

找到这 NN 个点中两个点的距离的最大值。

数据范围:N2×105N\leqslant 2\times 10^5

思路

求最大化最小值,考虑二分答案的方法,由于每个点有 x,yx, y 两个参数,故可以先对 xx 从小到大排序。

设答案为 MM,则一定存在 i>ji > j 使得,xixjMx_i-x_j \geqslant M 并且 yiyjM|y_i-y_j| \geqslant M

由于当前 xx 有序,则可以从小到大顺次枚举,对于当前枚举到的 ii,如果 jj 满足 xixjMx_i-x_j\geqslant M,则有 kj,xixkM\forall k \leqslant j, x_i-x_k\geqslant M,故 1j1\sim j 这些元素的 xx 值都已经满足条件,只需找到满足条件的 yy 值,由于满足条件的值一定是边界值,也就是最大或最小值,于是再维护 1j1\sim j 对应 yy 坐标的最大值和最小值,最终判断是否有满足条件的 yy 值即可。

总复杂度 O(NlogN)O(NlogN)


AtCoder Beginner Contest 215 - ABC215
https://wty-yy.github.io/posts/51581/
作者
wty
发布于
2021年8月23日
许可协议