CF EDU 169
A
-
题意:
一条线上给定
n
个点,询问是否能新插入一个点,使得这个点是距离这n
个点都是最近的 -
题解:
n > 2 n > 2 n>2 时,无解
n = 2 n = 2 n=2 时,直接插入到这两个点中间即可
B
-
题意:
总共 n n n 个房间,第 i i i 个房间与第 i + 1 i+1 i+1 个房间中间有一扇门,假如 A A A 可能在 [ l , r ] [l, r] [l,r] 中任意一个房间, B B B 在 [ L , R ] [L, R] [L,R] 中任意一个房间,最少需要关闭几扇门才能保证两人不可能见面
-
题解:
如果两人所在区间不相交的话,关闭
1
扇门即可如果两人可能所在区间相交的话,相交区间的所有门必须关闭,最后判断一下边界即可
C
-
题意:
Alice
和Bob
取数字,Alice
先手,Alice
取到的数字和为A
,Bob
取到的数字和为B
,Alice
想最大化A-B
,Bob
想最小化A-B
,在游戏开始前Bob
可以增大任意数字,但是总增加量不能超过k
,求A-B
的最小值 -
题解:
每个人都尽量取剩下的最大的数字
将数组排序,模拟取数字的过程,将最后结果减去
k
即可当有偶数个数字的时候,
A-B
的最小值不会小于0
,奇数个数字的时候,A-B
的最小值不会小于原先所有数字的最小值
D
-
题意:
总共有四种颜色的门,每个城市会有两扇不同颜色的门,其中城市
i
和j
如果具有相同颜色的门,他们之间是互相可以到达的,所花费的价值是 ∣ i − j ∣ |i-j| ∣i−j∣,每次询问城市 x x x 去 y y y 所花费的最小花费是多少 -
题解:
若 x x x 和 y y y 具有相同颜色的门,最小花费就是 ∣ x − y ∣ |x-y| ∣x−y∣
否则枚举所有与 x x x 和 y y y 不一样的情况,找到 x x x 右边第一个满足条件的门和 y y y 左边第一个满足条件的门,直接处理即可
E
-
题意:
取石子游戏,若一堆石子有
x
个,只能从中取出y
个,其中gcd(x, y)
必须等于1
。给定多堆石子,第i
堆有 a i a_i ai 个石子,问先手和后手谁能赢 -
题解:
考虑处理出来每个 a i a_i ai 的 S G \rm SG SG 值。
考虑 S G i \rm SG_i SGi,若 i i i 是质数,可以取任意 [ 1 , i − 1 ] [1, i-1] [1,i−1] 个石子,所以 S G i = m a x { S G j } + 1 SG_i=max\{SG_j\}+1 SGi=max{SGj}+1
若 i i i 不是质数,对于 i i i 的最小质因数 p p p, p p p 的所有倍数都取不到,因此 S G i = S G p + 1 SG_i = SG_p + 1 SGi=SGp+1
之后直接用 S G \rm SG SG 定理即可
F
-
题意:
给定一个数组
A
,每次可以进行一下两种操作- 用 A i + A i + 1 A_i+A_{i+1} Ai+Ai+1 替换 A i A_i Ai 和 A i + 1 A_{i+1} Ai+1
- 将 A i A_i Ai 拆成两个数字的和并替换掉 A i A_i Ai
f ( A ) f(A) f(A) 表示让 A A A 数组变成回文数组的最小次数,求 ∑ 1 ≤ l ≤ r ≤ n ( A [ l : r ] ) \sum\limits_{1\le l \le r \le n}(A[l:r]) 1≤l≤r≤n∑(A[l:r])
-
题解:
对于一个长度为 n n n 的数组,最坏情况是用 n − 1 n-1 n−1 次操作将其变成回文
但是对于某一个数组 A A A,取其一个前缀和一个后缀,若这两个子段和相等,可以减少一次操作
令 f l , r f_{l, r} fl,r 表示 A [ l : r ] A[l:r] A[l:r] 的最少操作次数,考虑
dp
,最优情况一定是:f l , r = min { f L , R + ( L − l ) + ( r − R ) } f_{l,r}=\min\{f_{L,R}+(L-l)+(r-R)\} fl,r=min{fL,R+(L−l)+(r−R)}
也就是 f l , r + l − r = min { f L , R + L − R } f_{l,r}+l-r=\min\{f_{L,R}+L-R\} fl,r+l−r=min{fL,R+L−R}
其中 ∑ i = L l A i = ∑ i = R r A i \sum\limits_{i=L}^l A_i = \sum\limits_{i=R}^r A_i i=L∑lAi=i=R∑rAi
对 A A A 做前缀和 s u m sum sum,转移条件变为:
s u m l − s u m L − 1 = s u m r − s u m R − 1 sum_l-sum_{L-1}=sum_r-sum_{R-1} suml−sumL−1=sumr−sumR−1,
也就是 s u m r − s u m l = s u m R − 1 − s u m L − 1 sum_r-sum_l=sum_{R-1}-sum_{L-1} sumr−suml=sumR−1−sumL−1
开一个桶 D D D,有 f l , r + l − r = D [ s u m r − s u m l ] f_{l,r}+l-r=D[sum_r-sum_l] fl,r+l−r=D[sumr−suml],每次转移完 f l , r f_{l,r} fl,r 后,更新 D [ s u m r − 1 − s u m l − 1 ] D[sum_{r-1}-sum_{l-1}] D[sumr−1−suml−1] 即可
G
-
题意:
给定一个又数字组成的字符串 s s s,可以将其划分乘偶数个非空子串 s i s_i si,会以一下规则构成新字符串 t t t:
- 依次对于每个 j ≤ i 2 j\le \frac{i}{2} j≤2i,将 s 2 × j s_{2\times j} s2×j 个 s 2 × j − 1 s_{2\times j - 1} s2×j−1 拼接到 t t t 后面( s i s_i si 下标从 1 1 1 开始)
给定 n n n 和 k k k,对于 s s s 中每个长度为 k k k 的字串,求出其以上述方法生成的 t t t 的最小长度
-
题解:
单独考虑一个字串 s s s,发现划分后所有的 s 2 × j − 1 s_{2\times j-1} s2×j−1 的长度一定为 1 1 1
令 f i , j f_{i,j} fi,j 表示考虑到第 i i i 位,现在所填写的子串要重复 j j j 次,这种情况的最小长度,有
f i , j = f i − 1 , j + j f_{i,j}=f_{i-1,j}+j fi,j=fi−1,j+j
f i , s i − 1 = min { f i , s i − 1 , f i − 2 , k + s i − 1 } f_{i, s_{i-1}} = \min\{f_{i,s_{i-1}},f_{i-2,k}+s_{i-1}\} fi,si−1=min{fi,si−1,fi−2,k+si−1}
考虑广义矩阵乘法,令 f i , 10 f_{i,10} fi,10 表示考虑到第 i i i 位,并且要更新 j j j 的值(也就是上面转移的第二种情况)
因为要求多个子数组的答案,直接双指针就行