atcoder ARC192 div2 部分题解
ARC 192(div2) Solution
还是不会做 atcoder 的短小思维题。
A - Union of Grid Paths
题意
对于一个 \(H\times W\) 的网格,给定一个长度位 \(H+W-2\) 的字符串 \(s \in \{R,D,?\}\) 。你需要将 \(?\) 替换成 \(R,D\) ,并确保字符串恰好包含 \(W-1\) 个 \(R\) 和 \(H-1\) 个 \(D\) ,此时字符串构成从 \((1,1)\) 走到 \((n,m)\) 的路径,把路径上所有点涂黑,问所有的替换方案中,总共涂黑的点有多少个。
题解
可以发现最终所有涂黑的点中,每一行的黑色块构成区间。
优先将 \(?\) 替换成 \(R\) 跑一遍得到每个区间的右端点,再优先把 \(?\) 替换成 \(D\) 跑一遍得到每个区间的左端点,就能算了。
B - Greater Than Average
题意
一个数列的价值是:
也就是严格大于平均值的数的个数,求一个数列的任意子序列的最大价值。
题解
序列价值和元素顺序无关,可以将 \(a_i\) 排序。
对于一个序列 \(a_i\) ,加入 \(x\leq \min(a_i)\) ,价值是不降的,同时对于 \(x<y<z\) ,选择 \(x,y\) 的价值不小于选择 \(x,z\) 的价值。
综上所述,最优的子序列是排序后的 \(a_i\) 的一个前缀,枚举求就行,具体的,能记录答案的 \(a_i\) 是选择的该前缀的一个后缀,二分出这个位置。
C - Removal of Multiples
题意
考虑初始 \(S=N^+\) ,多个操作,每次给定 \(a,b\) ,将 \(S\) 中所有 \(a\) 的倍数删去,并询问第 \(b\) 大。
\(a \geq 2, b \leq 10^5\)
题解
主体思路在于查询时二分答案,查询 \([1,mid]\) 有几个数没被删除。
发现质数是难以删去的,只有当 \(a\) 为质数时才删去,由于 \(b \leq 10^5\) 那么可以看出上限是第 \(10^5\) 大的质数,筛出来发现只有 \(3\times 10^6\) 差不多大小,因此过大的 \(a\) 就没有用处了。
基于以上,考虑直接用线段树暴力修改,单次删除一个数的复杂度是 \(O(\log M)\) ,把重复的操作删除后,每个数最多删除一次,且遍历次数是调和求和,复杂度大致是 \(O(Q\log^2M)\) 的。
查询直接在线段树上二分就行了。
每次遍历时可能会删除重复的数,注意要严格确保每个数只被删除一次。

浙公网安备 33010602011771号