A - Continuous 1
给定一个长度为 n 的只包含0
,1
,?
的字符串,是否只存在一种替换?
的方案使得字符串仅有 k 个1
且所有的 1
在某一个区间 [l,l+k−1]内。
滑动窗口,判断该区间是否可为 k 个 1
,且其他位置都是 0
。
code
B - Make Divisible
给定正整数 A,B,求最小的 X+Y 使得 X,Y≥0,(B+Y)=k(A+X),k≥1。
可以得到式子:Y=kA+kX−B。
上式可转化成 X+Y=kA+(k+1)X−B。
容易发现当 k 确定时,当X 最小时,X+Y 最小。
通过 X,Y≥0 得到:Xmin=max(0,⌊kB−1⌋+1−A)。
于是 X+Y=kA+(k+1)×max(0,⌊kB−1⌋+1−A)−B。
这里枚举 ⌊kB−1⌋ 的值,可以除法分块,设 w=⌊kB−1⌋,那么当 w 固定时,k 最小则 X+Y 最小。
复杂度 O(B)。
code
C - Path and Subsequence
给定 n 个点,m 个边的连通无向图(无自环重边,ui<vi)以及长度为 n 的数组 A ,长度为 k 的数组 B ,是否满足对于所有简单路径 v=(v1,v2,...,vp)(v1=1,vp=n),B 是 [Av1,Av2,...,Avp]的子序列。
设 fi 为所有从 1 到 i 的简单路径能扩展到的 B 的最小值,即[B1,...,Bfi]满足子序列关系。满足题目关系当且仅当 fn=k。
那么对于所有边 (u,v),v=i:fv=min(fu+[Bfu+1=Av]),特别的,当fu=k,fv=min(fv,k)。
基于 Dijkstra 的贪心思路,可以用堆优化做到 O(nlogn) 的 f 求解。
code
待更