做题记录 25.2.17
\(\textcolor{purple}\odot\) AT_agc045_b [AGC045B] 01 Unbalanced
\(0\) 视为 \(-1\),\(1\) 视为 \(+1\),则不平衡度为前缀和的极差
二分答案 \(Rs\)
判定时从左往右扫描,维护区间 \([L,R]\),表示当前前缀和可以到达的范围,\(L\) 和 \(R\) 奇偶性相同,枚举奇偶性
初始令 \(L\) 为 \([0,1]\) 中符合奇偶性的,令 \(R\) 为 \([Rs-1,Rs]\) 中符合奇偶性的
若扫到 \(1\) 则两个端点加一,若扫到 \(0\) 则两个端点减一,若为 \(?\) 则 \(L\) 减一 \(R\) 加一
若 \(L\) 和 \(R\) 超出范围则 \(\pm 2\) 以保证奇偶性
若某时刻 \(L>R\) 则当前奇偶性不合法
时间复杂度 \(O(n\log n)\)
\(\textcolor{purple}\odot\) AT_agc050_a [AGC050A] AtCoder Jumper
节点 \(x\) 连向 \(2x\) 和 \(2x+1\),下标取模映射到 \([1,n]\)
这样从 \(p\) 开始移动不超过 \(k\) 次可以到 \([2^kp,2^k(p+1))\),下标取模,显然当 \(2^k\ge n\) 时即可覆盖整个区间,因此最多移动次数不超过 \(\lceil\log_2(n)\rceil\),当 \(n\le 1000\) 时步数不超过 \(10\),满足要求
时间复杂度 \(O(n)\)
\(\textcolor{purple}\odot\) AT_agc045_c [AGC045C] Range Set
显然交换 \(a\) 和 \(b\) 不改变答案,因此假设 \(a\ge b\)
则某个字符串合法当且仅当其存在一个长度不小于 \(a\) 的子段,段内每个极长 \(1\) 连续段的长度都不小于 \(b\)
令 \({dp}_{0/1,i,j}\) 表示当前填了 \(1\sim i\),最后一个位置为 \(0/1\),且区间 \((j,i]\) 内每个极长 \(1\) 连续段的长度都不小于 \(b\)(要求 \(j\) 为满足要求的情况下的最小值)
边界为 \(dp_{0/1,0,0}=1\)
答案为 \(\sum_{1\le i\le n}\sum_{0\le j\le i-b}2^{\max(0,n-i-1)}{dp}_{0/1,i,j}\)(计入答案的 \(dp\) 不再向后转移,即计入答案后就将其清空)
转移为
显然可以前缀和优化到 \(O(n^2)\)
\(\textcolor{purple}\odot\) AT_agc041_d [AGC041D] Problem Scores
由于 \(a\) 单调,因此最后一个限制不强于对于每个 \(k<n\),有 \(a\) 的前 \(k+1\) 个数之和 大于 后 \(k\) 个数之和,而该限制不强于 \(a\) 的前 \(\lfloor\frac n2\rfloor+1\) 个数之和 大于 后 \(\lfloor\frac n2\rfloor\) 个数之和
令 \(T\) 为 \(a\) 的前 \(\lfloor\frac n2\rfloor+1\) 个数之和 减去 后 \(\lfloor\frac n2\rfloor\) 个数之和
考虑先令 \(a_i\gets n\),然后每次令一个前缀减一,并考虑其对 \(T\) 的影响
初始时 \(T=n\)
若选择前缀 \(p\;(p\le k)\),则 \(T\) 减少 \(p\)
若选择前缀 \(p\;(p>k)\),则 \(T\) 减少 \(k+1-(p-(n-k))=n-p+1\)
令 \(w_i\) 表示选择前缀 \(i\) 的代价,则每次操作相当于令 \(T\) 减去某个 \(w_i\),保持 \(T>0\)
这等价于对 \(w\) 做容量为 \(n-1\) 的完全背包的方案数
时间复杂度 \(O(n^2)\)
\(\textcolor{purple}\odot\) AT_agc050_c [AGC050C] Block Game
假如序列确定,则第一个 \(B\) 之前的部分没用,遇到第一个 \(B\) 时会在当前位置的相邻格子中任意选择一个放置,之后 \(S\) 会尽量向另一侧移动,第二个 \(B\) 会在另一侧,这样两个 \(B\) 将可达位置限定为一个区间,每次 \(S\) 方尽量走到中点,\(B\) 方尽量令划分剩下的部分最小
BSSBSBSB
#.
# .
# .
# .#
# . #
##. #
## .#
###.#
直接这么做状态数过多,考虑逆向扫描并计算对方胜利的方案数
逆向第一个 \(B\) 之后必须要有至少 \(1\) 个 \(S\),第二个之后必须要有至少 \(2\) 个,第三个之后必须要有至少 \(4\) 个,以此类推
令 \(dp_{i,j}\) 表示 \(i\sim n\) 中有 \(j\) 个 \(B\) 情况下对方胜利的方案数
初始 \(dp_{n+1,0}=1\)
若 \(i\) 位置可以为 \(S\),则 \(dp_{i,j}\gets dp_{i+1,j}\)
若 \(i\) 位置可以为 \(B\),则 \(dp_{i,j}\gets dp_{\min(n+1,i+2^{j-2}+1)}[\nexists i+1\le x\le i+2^{j-2}(s_x='B')]\),其中后面的条件容易通过预处理 \(O(1)\) 计算
\(j\le \lceil\log_2(n)\rceil\),否则 \(dp_{i,j}=0\),因此时间复杂度为 \(O(n\log n)\)
\(\textcolor{purple}\odot\) AT_agc050_d [AGC050D] Shopping
每次将已经获得商品的删去
令 \(dp_{l,r,i,j}\) 表示当前关注的人左侧还剩 \(l\) 人,右侧还剩 \(r\) 人,目前是第 \(j\) 轮(所有人来一遍为一轮),目前回合是剩下的人中第 \(i\) 个
则要求的是 \(dp_{i-1,n-i,1,1}\;(1\le i\le n)\)
令 \(m=l+r+1\) 表示剩余人数
当 \(j>k\) 时,剩下的人把所有的商品都问了一遍,此时游戏结束,贡献为 \(0\),因此此时值为 \(0\)
当 \(n-m\ge k\) 时,所有商品都取走了,同样游戏结束,值为 \(0\)
否则令 \(p=\frac{k-(n-m)}{k-j+1}\),表示当前决策的人取到商品的概率
若 \(i=l+1\),则决策的人为当前关注的人,有 \(p\) 的概率贡献为 \(1\),剩余 \(1-p\) 的概率贡献为 \(dp_{l,r,i+1,j}\)(若 \(r=0\) 则为 \(dp_{l,r,1,j+1}\))
若 \(i<l+1\),同理得 \(p\) 的概率贡献为 \(dp_{l-1,r,i,j}\),\(1-p\) 的概率贡献为 \(dp_{l,r,i+1,j}\)
否则 \(i>l+1\),\(p\) 的概率贡献为 \(dp_{l,r-1,i,j}\)(\(i=m\) 则为 \(dp_{l,r-1,1,j+1}\)),\(1-p\) 的概率贡献为 \(dp_{l,r,i+1,j}\)(\(i=m\) 则为 \(dp_{l,r,1,j+1}\))
建议使用记忆化搜索,时间复杂度 \(O(n^4)\)

浙公网安备 33010602011771号