ARC133 题解
A.Erase by Value
题目大意
给定一个长为 \(N\) 的序列,选择一个数并把它从序列中全部删掉,问操作完后字典序最小的序列。
\(1\leq N\leq 200000\)
直接考虑贪心。我们一次记录每个数的第一次出现,记录时判断这个数是否比上一个被记录的数小,如果是,那么我们选择删掉上一个数,这时我们一定可以得到字典序最小的序列。正确性显然。
复杂度: \(O(n)\)
代码:链接
B.Dividing Subsequence
题目大意
给定两个 \(1\sim n\) 的排列 \(P,Q\) ,从两个排列中各选一个长度相同的子序列 \(a,b\) (长度为 \(k\) ),要求对于 \(1\leq i\leq k\) 均有 $a_i\mid b_i $ 。求 \(k\) 的最大值。
\(1\leq N\leq 200000\)
首先对于 \(P\) 中的一个数 \(d\ (1\leq d \leq n)\) ,在 \(Q\) 中有 \(\left\lfloor\frac{n}{d}\right\rfloor\) 个数是它的倍数。那么对于 \(P\) 中的所有数与 \(Q\) 中数匹配,满足条件的 \(a,b\) 匹配对数为 \(\sum\limits_{i=1}^{n}\frac{n}{i}=O(n\log n)\) 。
现在我们考虑 \(DP\) ,令 \(dp_{i,j}\) 表示已经考虑到 \(P\) 中的前 \(i\) 个数,\(Q\) 中被匹配的数中最靠后的下标为 \(j\) 时匹配对数最大值。
转移很简单,我们从前到后枚举 \(P\) 中的每一个数,然后对于每个数,找到 \(Q\) 中它的倍数的下标。假设这个数是 \(P_i\) ,\(Q\) 中它的倍数的下标为 \(j\) 。那么 \(dp_{i,j}=\max\limits_{k=1}^{j-1}(dp_{i-1,k})+1\) 。
显然暴力 \(DP\) 是过不了的,我们需要优化。我们发现我们枚举到 \(P\) 中的每一位都是由上一位转移过来的,所以我们可以滚动数组滚掉第一维。然后我们每次转移都需要求区间最大值,每次更新都需要修改一个位置的值,所以我们可以用线段树来优化以上过程。
因为满足条件的匹配数(也就是状态数)只有 \(O(n\log n)\) 。所以复杂度可以接受。
复杂度 : \(O(n\log^2 n)\)
代码: 链接
C.Row Column Sums
题目大意
现在有一个 \(H\times W\) 的表格,要求往里面填数,填数范围是 \(0\sim K-1\) 。要求表格满足以下要求。
- 对于每一行,所填数的和要求模 \(K\) 余数为 \(A_i\) 。
- 对于每一列,所填数的和要求模 \(K\) 余数为 \(B_i\) 。
要求判断是否有解,若有解,给出表格中所有数的和的最大值。
\(1\leq H,W \leq200000\quad 2\leq K \leq 200000\quad 0\leq A_i ,B_i \leq K-1\)
首先判断有无解十分简单,只需判断所有 \(A_i\) 的和与所有 \(B_i\) 的和是否模 \(K\) 同余即可。若不同余显然无解,反之也显然一定有解。
然后对于最大值,我们先把所有的数都填成 \(K-1\) ,然后我们算出每一行与每一列此时模 \(K\) 的余数,因为我们都是填的最大的数,我们只能往下减来满足每一行与每一列的要求。我们设 \(R_i\) 表示第 \(i\) 需要减的数量,\(C_i\) 表示第 \(i\) 列需要减的数量。那么首先给出结论,答案就是:\(HW(K-1)-\max(\sum\limits_{i=1}^{H}R_i,\sum\limits_{i=1}^{W}C_i)\) 。
首先因为一定有解所以 \(\sum R_i\) 和 \(\sum C_i\) 一定关于 \(K\) 同余。所以给较小的数加上一个 \(K\) 的倍数就可以了。
令 \(Z= \max(\sum\limits_{i=1}^{H}R_i,\sum\limits_{i=1}^{W}C_i)\) 。我们重复以下操作 \(Z\) 次。
- 找到一组 \((i,j)\) 使得 \(R_i\geq 1,C_i\geq1\) ,我们把 \((i,j)\) 这个格子中的数减去 \(1\) ,\(C_i,R_i\) 也减去 \(1\) 。
因为 \(\min(R_i,C_i)\leq K-1\) ,所以最后每个格子中的数一定合法。
复杂度:\(O(n)\)
代码: 链接
D.Range XOR
题目大意
给定 \(L,R,V\) 。求满足以下条件的二元组 \((l,r)\) 数量,对 \(998244353\) 取模。
\(L\leq l\leq r\leq R\)
\(l\oplus (l+1)\oplus(l+2)...\oplus r=V\)
\(1\leq L\leq R \leq 10^{18}\quad 0\leq V\leq 10^{18}\)
对于第二个要求,可以很显然转换成前缀和,所以我们从前缀和角度来考虑。令 \(w_k=0\oplus1\oplus2...\oplus (k-1)\) 。
那么我们现在想要求的就是满足 \(L\leq i<j\leq R+1\) 且 \(w_i\oplus w_j=V\) 的二元组 \((i,j)\)的数量。
我们可以进行差分,那么我们要解决的问题就进一步变成:\(0\leq i <A\quad0\leq j <B\quad w_{i}\oplus w_{j}=V\) 。
这里差分之后答案的统计实际上是容斥,我们的答案就是 \(\dfrac{1}{2}(F(R+2,R+2)-F(L,R+2)-(F(L,R+2)-F(L,L)))\) 。\(F(A,B)\) 表示上面问题上限为 \(A,B\) 的答案。解释一下,我们实际上是逐渐把不符合要求的删去,对于 \(F(L,R+2)-F(L,L)\) 我们实际上是在删去 \(i< L ,L<j<R+2\) 的方案数。
这里我们容易发现 \(w_k\) 的取值在 \(k\) 模 \(4\) 意义下有很好的性质。
- \(w_{4x}=0\quad w_{4x+1}=4x\quad w_{4x+2}=1\quad w_{4x+3}=4x+3\)
显然的做法是我们对任意两个都考虑一边,一共 \(16\) 种组合。实际上我们可以把 \((4x,4x+2)\) 放在一起考虑,\((4x+1,4x+3)\) 同理。这样就一共只有 \(4\) 种组合了。
这当中最为复杂的就是 \((4x+1,4x+3)\) 这一组了。我们单独考虑,我们首先把\(4\) 消去,然后可以进行记忆化递归。具体实现参考代码。
当 \(V=0\) 时,我们要注意一下,我们要减去 \((R+1)-L+1=R+2-L\) 。
**注意一下取模问题,有可能会爆 \(long\ long\) ** 。
复杂度:\(O(poly(\log \max(R,V)))\)
代码:代码
E.Cyclic Medians
题目大意
给定 \(N,M,V,A\) ,进行以下操作。
- 构建一个长度为 \(N\) 的数组,值域为 \(1\sim V\) :\(x=({x_1,x_2,...,x_N})\)
- 构建一个长度为 \(M\) 的数组,值域为 \(1\sim V\) :\(y=({y_1,y_2,...,y_N})\)
- 将 \(A\) 赋值给 \(a\) 。
- 对于 \(0\leq i\leq N\times M-1\),进行以下操作
- 用 \(a,x_{(i\ mod N )+1},y_{(i\ mod M )+1}\) 的中位数替换 \(a\) 。
- 得到最终的 \(a\) 。
求对于所有的 \(x,y\) 数组,最后的 \(a\) 的值之和,答案对 \(998244353\) 取模。
\(1\leq N,M\leq 200000\quad 1\leq A\leq V\leq200000\)
我们假设最后的答案位于 \(0\sim V-1\) 之间。
那么我们最后的答案就是:对于所有的 \(1\leq k \leq V-1\) ,最后答案 \(a\ge k\) 的方案数之和。 (这里相当于是说,对于每个答案都变成方案数。最后答案 \(a\) 对答案的贡献是 \(a\),那么比不大于它的 \(k\) 也有 \(a\) 个。因此可以这样转换)。
现在对于一个固定的 \(k\) ,我们把数组中小于它的数改为 \(0\) ,不小于它的数改为 \(1\) 。那么我们就得到了一个 \(0/1\) 数组。同时,我们观察到 \((0,0,a)\) 取中位数是 \(0\) ,\((1,1,a)\) 取中位数是 \(1\) 。因此如果\(x,y\) 有一位上是一样的,那么最后的答案就和 \(A\) 没有关系。那么我们把这种的 \(x,y\) 数组成为”非激活的“ 。其他的也就是”激活的“。
我们首先考虑”非激活的“情况,由于显然的对称性,我们可以发现 \(k=p\) 时候最后答案为 \(1\) 的数量和 \(k=V-p\) 时候最后答案为 \(0\) 的数量是一样的。所以我们统计答案时候只需要统计一般,(注意:对于 \(k=V/2\) 的情况特判一下)。
我们接着考虑”激活的“情况。我们记 \(d=\gcd(N,M)\) ,那么任何一组”激活的“应该满足以下条件。
- 对于所有 \(1\leq i \leq d\) ,\(x_i=x_{i+d}=... \quad y_i=y_{i+d}=... \quad x_i\ne y_i\) 。
因此我们可以得出”激活的“情况数是: \((k^{N/d}(V-k)^{M/d}+k^{M/d}(V-k)^{N/d})^d\) 。但是注意这时候最后的答案是 \(A\) ,所以我们只能统计 \(k\leq A\) 时的答案。
具体见代码。
复杂度: \(O(V(\log N+\log M))\)
代码:链接
F.Random Transition
还没看懂题解,先咕着。