ARC183 做题记
A (Median of Good Sequences)
题意
给定正整数 \(N,K\),如果一个长度为 \(NK\) 的序列中 \(1\) 以上 \(N\) 以下的整数分别出现了 \(K\) 次,则称这个序列为良好序列。
输出所有良好序列排序后的中位数那个序列。\(n\) 个排列的中位数定义为第 \(\lfloor\frac{n+1}{2}\rfloor\) 个排列。
\(N,K\le 500\)
题解
随便对称性计算一下即可。
B (Near Assignment)
题意
给定两个长度为 \(n\) 的序列 \(A,B\) 以及整数 \(k\),可以进行以下操作任意多次(也可以不操作):
选择两个整数 \(i,j\)(\(1\le i,j\le n\))满足 \(|i-j|\le k\),将 \(a_i\) 的值变为 \(a_j\)。
求是否可以将 \(A\) 序列变为 \(B\) 序列,如果可以,输出 Yes,否则输出 No。
\(1\le k<n\le 2.5\times 10^5\)。
题解
依然是倒着做,通配符。
倒着做意味着选择 \(i, j\) 满足 \(|i - j| \le k\) 且 \(a_i = a_j\),将其中一个变成 \(?\),其中 \(?\) 可以在想要的时候被替换成任意字符。
我们注意到,当 \(B\) 数组中存在 \(?\) 时,\(B\) 数组相邻字符可以被随意交换。因为 \(?x\) 可以变成 \(x?\),意味着 \(?\) 可以随意移动。
同时 \(xy\) 可以借一个 \(?\),使得 \(?xy \to yxy \to yx? \to ?yx\)。(这里需要满足 \(k \ge 2\))
因此,当 \(B\) 中数组中的数全在 \(A\) 数组中出现过且 \(B\) 中存在 \(?\) (意味着存在两个相同的数距离 \(\le K\)) 且 \(k \ge 2\) 时:那么 \(B\) 数组中的相同的数可以只剩下一个,其他的全是问号,则 \(B\) 一定可以变成 \(A\)。
我们再考虑其他情况,若 \(B\) 中数组中的数有在 \(A\) 数组没出现的,就是无解。若 \(B\) 数组中不存在 \(?\),意味着 \(A = B\) 才有解,可以特判。若 \(k = 1\),直接特殊处理。
C (Not Argmax)
题意
给定一个 $ (1,2,\cdots,N) $ 的排列 $ P=(P_1,P_2,\cdots,P_N) $,请计算满足以下 $ M $ 个条件的排列数量,并将答案对 $ 998244353 $ 取模。
- 第 \(i\) 个条件:在 $ P_{L_i},P_{L_i+1},\cdots,P_{R_i} $ 这一段中,最大值不是 \(P_{X_i}\)。其中,\(L_i,R_i,X_i\) 是输入给定的整数。
\(1\leq N\leq 500 ,M\le 10^5,1\leq L_i\leq X_i\leq R_i\leq N\)
题解
考虑一个区间内最有代表性的是什么。不难发现就是它的最大元素;于是我们考虑在转移时枚举这个最大元素的位置。
假设我们考虑到了区间 $ [l, r] $,枚举到最大元素位置为 $ k \in [l, r] $,显然若 $ \exists [L, R] \subseteq [l, r] $,使得 $ [L, R] $ 内位置 $ k $ 不能作为最大值,那么 $ [l, r] $ 的最大值就不能在位置 $ k $。否则我们就可以递归到子问题。
下面我们说明正确性。注意到我们只考虑了 $ [L, R] \subseteq [l, r] $,否则的话一定会跨过一个比 $ [l, r] $ 内最大值更大的值,例如 $ p_{l-1} $ 或 $ p_{r+1} $。那么这样的 $ [L, R] $ 一定合法,不需要考虑。
那么我们就可以设计状态了:设 $ f(l, r) $ 为在 $ [l, r] $ 内填入 $ (r - l + 1) $ 个互不相同的整数,使得合法的方案数——注意我们并不关心到底是哪些整数。转移显然就是:
至于条件的判断,随便预处理即可做到 $ \Theta(1) $ 查询。最终总时间复杂度 $ \Theta(N^3) $。
D (Keep Perfectly Matched)
题意
有一棵包含 \(N\) 个顶点的树,顶点编号为 \(1\) 到 \(N\)。第 \(i\) 条边连接顶点 \(A_i\) 和顶点 \(B_i\)。
这里 \(N\) 是偶数,并且这棵树存在一个完全匹配。具体来说,\(\forall i\in [1,N/2]\),都有 \(A_i = 2i - 1, B_i = 2i\)。
你需要进行如下操作共 \(N/2\) 次:
- 每次选择两个叶子(度数恰好为 \(1\) 的顶点),并将它们从树中删除。此时,删除后的树也必须仍然存在完全匹配。注意,在本题中,顶点数为 \(0\) 的情况也视为一棵树。
对于每次操作,其得分定义为 所选两点之间的距离。
请给出一种操作顺序,使得总得分最大。可以证明,在本题的约束下,总能完成 \(N/2\) 次操作。
\(N\le 2.5\times 10^5,2\mid N,A_i<B_i\)
题解
考虑如下结论:
对于一棵树 \(T\),令 \(sz_u\) 表示 \(u\) 的子树大小。那么 \(T\) 有完美匹配当且仅当:
\(\sum\limits_{i=1}^{n} [sz_i \bmod 2 = 1] = \sum\limits_{i=1}^{n} [sz_i \bmod 2 = 0]\)
我们令 \(sz_i \bmod 2 = 0\) 的点为 \(0\) 号点,否则为 \(1\) 号点。容易发现:
- 对于每个 \(0\) 号点,其子节点中至少有一个 \(1\) 号点,否则它一定是 \(1\) 号点。
- 对于每个 \(1\) 号点,它的父亲可以是 \(0\) 号点,也可以是 \(1\) 号点。
因此 \(0\) 号点的数目一定不多于 \(1\) 号点的数目,所以当满足上述等式时,有:
- 对于每个 \(0\) 号点,它有且仅有一个儿子为 \(1\) 号点。
- 对于每个 \(1\) 号点,它的父亲均为 \(0\) 号点,换句话说,它们的儿子均为 \(0\) 号点。
因此,显然存在一种方案,使每个 \(1\) 号点和它的父亲匹配,此时这样构成一个完美匹配。
唯一性是很好说明的:在存在完美匹配的情况下,显然每个叶子节点只能和它的父亲匹配,以此类推,否则叶子节点不能匹配,因此完美匹配方案唯一。
回归本题,首先我们找到重心,以重心为根。我们猜测此时的上界 \(\sum dep_i\) 是可以取到的。
显然根节点始终为 \(0\) 号点,注意到删除一个点会让它到根的所有 \(sz\) 都减一,也就是取反。
可以推得,删路径的时候,一定是从根节点找两个儿子,一个为 \(1\) 号点,另一个为 \(0\) 号点,从这两个点往下搜 \(0\) 号点必须走 \(1\) 号点,\(1\) 号点可以随便走。只有在这种情况下,才能保证每次删完后它仍然存在完美匹配。
删完还有完美匹配,是因为上述 \(sz\) 的 \(01\) 结构仍然保持即可。
那么我们可以钦定每个子树的删除顺序:对于 \(0\) 号点,先把 \(1\) 号点儿子的子树删空,容易发现一直删它直到把它删空一定是合法的,然后它就变成 \(1\) 号点了,此时与顺序无关,随便怎么删都行;对于 \(1\) 号点,删掉儿子不影响奇偶性所以可以随便删。
因为根节点是重心,我们每次取当前 \(sz\) 最大的 \(0\) 号点儿子和 \(1\) 号点儿子显然最后只会剩下下一个点,它和根节点匹配即可。
容易发现它取到了上界,所以显然是对的。删除过程可以参考代码理解。
E (Ascendant Descendant)
题意
有一棵包含编号为 \(1\) 到 \(N\) 的 \(N\) 个顶点的根树,根是顶点 \(1\),\(i\) 的父节点是 \(P_i\)。
同时,给定两个长度为 \(M\) 的整数序列 \(A=(A_1, A_2, \cdots, A_M)\) 和 \(B=(B_1, B_2, \cdots, B_M)\),其元素均为 \(1\) 到 \(N\) 之间的整数。
定义序列 \(A\) 是 good 的,当且仅当对每个 \(i\),顶点 \(A_i\) 是顶点 \(B_i\) 的祖先,或者 \(A_i = B_i\)。
初始时,序列 \(A\) 是 good 的。
我们考虑对序列 \(A\) 进行以下操作:
- 选择一个整数 \(i\) (\(1 \leq i \leq M-1\)),交换 \(A_i\) 和 \(A_{i+1}\) 的值。操作后,序列 \(A\) 仍必须是 good 的。
请计算,经过 \(0\) 次或多次操作后,可能得到的不同序列的个数,并输出该结果对 \(998244353\) 取模的值。
\(2 \leq N,M \leq 2.5\times 10^5,P_i<i\)
题解
首先你可以预处理出每个点 \(i\) 能移动到的位置所在区间 \([l_i, r_i]\),需要满足 \(a_i\) 是 \(\text{lca}(b_{l_i}\sim b_{r_i})\) 的祖先。
我们发现若两个区间有交,则 \(a_i,a_j\) 都是区间交的 \(\text{lca}\) 的祖先。
于是两个有交的区间一定是呈 包含关系。所有区间按照包含关系呈树形结构。
但是实际上一个点的移动范围并不一定是 \([l_i, r_i]\)。
若 \(i\) 子树中一个 \(j\) 满足 \(j\) 的子树大小恰好是 \(r_j - l_j + 1\),那么相当于说这个区间内的位置恰好被 \(j\) 的子树覆盖。
那么 \(i\) 这个点就不可能从 \(< l_j\) 的位置移动到 \(> r_j\) 的位置。
考虑使用 set 实时维护 \((l,r,x)\),表示区间 \([l,r]\) 还剩下 \(x\) 个位置可以放数。
按照 区间长度从小到大 加入点 \(i\),从 \(i\) 向左右扩张。扩张到 \(<l_i,>r_i\) 或者 \(x=0\) 就停止,扩张的时候贡献 \(x\)。
类似颜色段均摊的写法,再把中间的段删了,插入新的段即可,记得 \(x-1\),因为放了一个数。
然后 \(i\) 的贡献就乘上扩张的 \(x\) 加起来的值即可。
最后你注意到 \(a\) 可能有些相同,除一些阶乘逆元即可。
F (Sum of Minimum Distance)
题意
给定正整数 \(A, B, X, Y, N\),其中保证以下条件:
- \(A < B\)
- \(\gcd(A,B) = 1\)
- \(1 \leq N \leq A+B-1\)
定义一个函数 \(f(n)\) 如下:
- 从整数 \(x=0\) 开始,通过以下操作之一,达到 \(x=n\) 所需的最小代价为 \(f(n)\):
- 用 \(x\pm A\) 替换当前的 \(x\),此操作花费 \(X\)。
- 用 \(x\pm B\) 替换当前的 \(x\),此操作花费 \(Y\)。
由于 \(A, B\) 的约束,可以证明对于任意整数 \(n\),\(f(n)\) 都可以被定义。
现在需要计算 \(\sum\limits_{1 \leq n \leq N} f(n)\) 的值,并对 \(998244353\) 取模。
\(T\) 组多测。\(T \leq 10^3,1 \leq A ,B, X, Y \leq 10^9\)
题解
这篇除了类欧板子外代码非常短!
前置知识:类欧几里得算法,ABC402G 最后一步计算方法。
- 下面把 \(X,Y\) 改写成 \(wa,wb\),而原题面 \(A,B,N\) 大小写不定,能理解即可。
设 \(n=Au+Bv\),则容易发现 \(u,v\) 一定一正一负。
不妨设 \(u>0,v<0\),考虑水多加面,面多加水的 trick,我们能始终保持运算过程中 \(x\in [0,A+B-1]\),不影响结果。
即 \(x<B\) 时,\(x\gets x+A\),否则 \(x\gets x-B\)。
于是我们看成一个 \([0,A+B-1]\) 的环,连边是 \(x\in [0,B-1],x\overset{wa}\longrightarrow x+A;\quad x\in [B,A+B-1],x\overset{wb}\longrightarrow x-B.\)
从 \(0\) 开始走一圈到每个点的代价就是 此时 每个点的最小代价 \(f(n)\)。
然后 \(u<0,v>0\) 时同理得到 \(g(n)\)。则 \(ans=\sum\limits_{n=1}^N \min (f(n),g(n))\)。
我们给出结论:\(f(n)+g(n)\) 是一个定值 \(tot\)。
考虑到 \(g(n)\) 其实是满足 \(u<0,v>0\),且 \(|u|,|v|\) 最小的那组构造方案的价值。
\(f(n)\) 同理。于是 \(f(n)\) 方案对应的 \((u',v')\) 应该是 \(g(n)\) 中的 \((u+B,v-A)\)。
于是 \(f(n)+g(n)=B\cdot wa+A\cdot wb=tot\)。
于是对于 \(\min(f(n),g(n))\),以 \(lim=\frac{tot}{2}\) 为分界线分别统计即可。
假设我们二分出了在第一个环上,从 \(0\) 开始走 \(l\) 步开始第一次代价超过 \(lim\)。
记 \(\text{calc}(a,b,m,n,wa,wb)\) 表示在 \((+a,-b)\),代价 \((wa,wb)\) 的环上走 \(m\) 步,走过的所有 \(\le n\) 的数的代价和。
则 \(ans=\text{calc}(a,b,l,n,wa,wb)+\text{calc}(b,a,a+b-1-l,n,wb,wa).\)
因为第一个环走 \(l\) 步,显然第二个环得走 \(a+b-1-l\) 步。
那怎么二分出 \(l\) 呢?只需要对于单个 \(l\),快速求出环上走 \(l\) 步的代价即可。
考虑在 \((+a,-b)\) 的环上走 \(m\) 步的 \(-b\) 操作次数 \(t_m\) 是可以计算的。
\(x_m=(m-t_m) \cdot a - t_m \cdot b =ma-(a+b)t_m\Rightarrow t_m=\dfrac{ma-x_m}{a+b}.\)
由于 \(x_m<a+b\),得到 \(x_m=ma\bmod {(a+b)},\quad t_m=\left\lfloor\dfrac{ma}{a+b}\right\rfloor.\)
于是代价就是 \(wa\cdot (m-t_m)+wb\cdot t_m=wa\cdot m+(wb-wa)\cdot t_m.\)
接下来我们计算 \(\text{calc}\) 函数。令 \(b\gets a+b\),此时有 \(a,m,n<b\),这个条件比较关键。
根据上面算得的代价重写一下式子:
考虑经典套路:
因为第一个等号的第二项可能是负的,比较坏,于是换成第二个等号的形式。
inline LL sol(LL a,LL b,LL m,LL n,LL wa,LL wb)
{
b+=a;LL ans=0;
for(LL i=1;i<=m;i++) ans+=((i*a)/b+1-(i*a+b-n-1)/b)*(i*wa+(wb-wa)*((i*a)/b)),ans%=mod;
return ans;
}
接下来肯定是通过若干类欧,去解决这么多下取整。
这东西是最标准的类欧,套用模板题即可。
这个的绝大部分项都可以用类欧模板计算,除了
这一项。但是直接套用 ABC402G 的结论也可以类欧 $1\log $ 计算。
具体的,考虑 \(p_i=\left\lfloor\dfrac{ia}{a+b}\right\rfloor,q_i=\left\lfloor\dfrac{ia+(b-n-1)}{a+b}\right\rfloor\) 满足 \(q_i-p_i\in \{0,1\}\)。
于是 \(\sum (q_i-p_i)(q_i-p_i-1)=0\),由此解出 \(\sum p_iq_i\),其他项都是类欧板子。
总复杂度 \(\mathcal{O}(T\log (a+b))\),跑得飞快。

浙公网安备 33010602011771号