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

题意

一个数列的价值是:

\[\sum [a_i>\frac{\sum a_i}{n}] \]

也就是严格大于平均值的数的个数,求一个数列的任意子序列的最大价值。

题解

序列价值和元素顺序无关,可以将 \(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)\) 的。

查询直接在线段树上二分就行了。

每次遍历时可能会删除重复的数,注意要严格确保每个数只被删除一次。

代码

posted @ 2025-05-12 10:43  蒻蒻虫  阅读(26)  评论(0)    收藏  举报