ARC 做题记录
(A):独立做出来了,不一定写了。[A]:没有独立做出来,但是是我犯糖,没写。A:没有独立做出来。*:困难的。**:难爆了。
ARC070
(C)
贪心,能加则加,如果出现某个 \(+i\) 后 \(>x\) 的话,设现在与 \(x\) 相差 \(r\),则可以将 \(+(i-r)\) 的那个变成 \(+i\)。时间复杂度 \(O(\sqrt x)\)。
D
擦,我居然不会这个 trick。
一个元素 \(a_i\) 不可能成为不必要的,当且仅当,去掉这个元素后,存在一个和为 \([k-a_i,k-1]\) 的选取方案。
发现这东西是一个回退背包,于是直接求方案数。方案数比较多,对一个大质数取模即可。时间复杂度 \(O(nk)\)。
*E
首先有一个很显然的 dp,设 \(f_{i,j}\) 表示处理了前 \(i\) 个矩形,且第 \(i\) 个矩形的左端点在 \(j\) 的最小代价。令 \(\text{len}_i=r_i-l_i\),那么显然有转移:
发现 \(|j-l_i|\) 是一个下凸函数,且前面这个 \(\min\) 是在取滑动窗口最小值,归纳一下可以得到 \(f_{i}(j)\) 也是一个下凸函数。于是考虑 slope trick。
设这个凸函数上最小值为 \(m\),且对应的最小值区间为 \([p,q]\),则可以可以将上式转化为:
后面这个式子相当于在缩小这个最小值区间,即 \([p,q]\) 变成 \([p-\text{len}_i,q+\text{len}_{i-1}]\)。
然后还要加上前面这个绝对值函数,这等价于将 \((-\infty,l_i]\) 的这些折线斜率整体 \(-1\),将 \([l_i,+\infty)\) 的折线斜率整体 \(+1\)。然后我们需要维护 \(p,q\),考虑分讨:
- \(p\le l_i\le q\):此时最小值只有 \(l_i\) 一个位置,将 \(l_i\) 左边的斜率 \(-1\),右边的斜率 \(+1\) 即可。
- \(l_i<p\):\(l_i\) 右侧斜率为 \(-1\) 的段 \([x,y]\),斜率会变成 \(0\),那么新的最小值区间为 \([\max(x,l_i),y]\)。
- \(l_i>q\):与上一种同理,新的区间即为 \([x,\min(y,l_i)]\)。
整个过程可以使用两个堆分别维护 \(p\) 左侧和 \(q\) 右侧的斜率拐点,每次要找到堆内的前两个拐点,以及对整个堆的横坐标整体偏移,后者打标记即可。时间复杂度 \(O(n\log n)\)。
F
入门组初赛考这个吗,有意思。
首先如果 \(a\le b\) 那么显然无解。
考虑维护一个栈,然后遍历这 \(n\) 个人,每遍历到一个人 \(i\),我们询问栈顶的人 \(i\) 是否诚实。如果为否,那么这两人中至少有一人不诚实,同时弹出栈即可;否则加入栈。
最终栈从底到顶就是 \(\tt 00\cdots011\cdots1\) 的结构,由于 \(a>b\),所以栈顶的人一定是诚实的。然后拿这个人一个一个问即可。故总询问次数一定不超过 \(2n\)。
ARC101
(C)
显然最优方案的分布是一个长度为 \(k\) 的区间,扫一遍即可。
[D]
考虑正常求中位数,可以二分答案,将 \(>\text{mid}\) 的变成 \(1\),将 \(<\text{mid}\) 的变为 \(-1\),然后判断整个序列的和是否 \(\ge 0\)。
那这个题就等价于,是否有一半的子段和 \(\ge 0\)。设 \(s_i\) 为前缀和的话,那么以 \(i\) 结尾的符合要求的段数即为 \(\sum\limits_{j=1}^i[s_i-s_{j-1}\ge 0]\)。值域 BIT 做二维偏序即可。
E
有一种容易想到的 dp 是 \(f_{x,i}\) 表示 \(x\) 子树内还有 \(i\) 个点需要向外匹配的方案数,然后可以对一条边 \((u,v)\) 枚举需要匹配的点数 \(i,j\) 和直接匹配的数量 \(k\) 做转移。但这时间复杂度爆干净了。
考虑容斥。不合法方案相当于断开一个边集,然后每个连通块内部匹配。
于是设 \(f_{x,i}\) 表示 \(x\) 子树内且 \(x\) 所在连通块大小为 \(i\) 的方案数。于是有转移:
最后答案即为 \(\sum\limits_{i=1}^n f_{1,i}\cdot i!!\),时间复杂度同树上背包,为 \(O(n^2)\)。
F
考虑将向左向右的移动,刻画为坐标系上的向上向右的折线。设 \(i\) 号点左右离得最近的洞为 \(x_i,y_i\),那么最终落入的洞就取决于点先碰到 \(x=x_i\) 还是 \(y=y_i\)。
设 \(x'_i=x_i-0.5,y'_i=y_i-0.5\),如果将所有的 \((x'_i,y'_i)\) 放在平面上,那么在折线右下的 \((x'_i,y'_i)\) 的就表示 \(i\) 号点落入了左侧的洞,反之左上的就是右侧的洞。
发现位于右下的 \((x'_i,y'_i)\) 是被折线用唯一一种方式贴着的。于是我们对着折线 dp,设 \(f_i\) 表示到第 \(i\) 个点,并且钦定该点被折线贴着的方案数,于是有转移式子:
BIT 维护二维偏序即可。
ARC114
(A)
\(50\) 以内只有 \(15\) 个质数,\(2^{15}\) 枚举质数乘起来检验即可。
(B)
显然只会选择若干个置换环,于是答案就是 \(2\) 的置换环个数幂次再 \(-1\)。
C
假设给定了序列。对于一个点,如果它和离它最近的跟它相等的点之间的点,权值都比它们大,那么这两个点就可以同时被操作,可以连边表示。于是贡献就是连通块数量,可以直接钦定连通块内最左边的那个点贡献 \(1\)。
回到原问题,考虑用总贡献 \(nm^n\) 减掉每个点多算的贡献。对于点 \(i\) 可以枚举与它相连的点 \(j\) 以及权值 \(k\),然后容易计算答案,于是有答案式子:
D
首先有一些容易发现的事情。
- 一颗棋子只会朝一个方向走。
要是回头走的话只会变劣,还不如不走多余的路。 - 棋子之间的移动路径的边不会相交。
对于两颗棋子,路径去掉相交的部分,仍然是分别包含两颗棋子的路径,直接这样走显然比原先更优。
现在这个问题相当于是要做 \(n\) 次区间取反,每个区间给定了一侧端点,对区间 \([l,r]\) 取反的代价为 \(r-l\),问最后所有颜色段的端点恰好依次为 \(t_1,t_2,\cdots,t_k\) 的最小代价。
区间取反的话可以异或差分一下,就变成了取反两个端点。
然后对于所有 \(a_i\) 我们都可以预先取反掉,于是我们可以得到剩下的需要被取反的位置 \(b_1,b_2,\cdots,b_m\)。
然后我们就是在做一个对 \(a_i\) 匹配的操作。对于一个初始端点 \(a_i\),我们可以给它匹配一个最终要匹配的端点 \(b_j\),也可以匹配一个原先的端点 \(a_{i-1}\)。
那这个显然可以 dp,升序 \(a,b\) 后,设 \(f_{i,j}\) 表示匹配了 \(a\) 的前 \(i\) 个、\(b\) 的前 \(j\) 个的最小代价。时间复杂度 \(O(nm)\)。
无解的话显然就是 \(n<m\)。
E
这个纸张缩小的限制很烦,但实际上可以转化为:初始横纵一共 \(H+W-2\) 条直线,随机一个长度为 \(H+W-2\) 的排列,然后顺次切当前可以切的直线。
根据期望的线性性,期望次数等于每条线被切割的概率之和。
然后对于极小的可切出矩形,其四侧的直线,由于整体上互不影响,于是可以分开考虑。对于一条直线,如果它排在另外 \(k\) 条之后切,就会产生 \(\dfrac 1{k+1}\) 的贡献。于是四侧分别枚举累加即可。
*F
由于操作后的排列字典序一定不会小于原排列,于是我们要最大化不变的前缀。
贪心地,我们需要尽可能地划分前缀,这个显然是最长下降子序列长度。
然后对于剩下的一段,我们用值域 BIT 维护可以划分的段数即可。
ARC157
(A)
一个串形如一段 \(\tt X\) 一段 \(\tt Y\) 的交替,于是 \(\tt XY\) 和 \(\tt YX\) 个数相差不会超过 \(1\)。
同时,如果同时存在 \(\tt XX\) 和 \(\tt YY\),那么一定会存在 \(\tt XY\) 或 \(\tt YX\)。
这两个判掉就可以了。其实要构造也是容易的。
(B)
如果 \(k\) 不大于 \(\tt X\) 的个数,那么取出极长 \(\tt X\) 段后按长度升序贪心改即可。
如果 \(k\) 大于 \(\tt X\) 的个数,那么先全部将 \(\tt X\) 改为 \(\tt Y\) 后,将极长未修改段拿出来,按长度降序贪心即可。
[C]
设 \(f_{i,j}\) 表示 \((1,1)\to(i,j)\) 的答案。由于 \((a+1)^2=a^2+2a+1\),于是可以得到转移式子 \(f_{i,j}=f_{x,y}+g_{x,y}+\binom{x+y-2}{x-1}\),其中 \(g_{i,j}\) 表示 \((1,1)\to(i,j)\) 的权值和。\(g\) 的转移显然是 \(g_{i,j}=g_{x,y}+\binom{x+y-2}{x-1}\)。
D
我怎么卡在了最糖的最后一步。
设 \(\tt Y\) 的个数为 \(c\)。首先 \(2\nmid c\) 显然不合法。
然后设横着切成 \(p\) 块,竖着切成 \(q\) 块,那么首先要保证 \(pq=\dfrac c2\)。然后对于每一块都得是恰好两个 \(\tt Y\),相当于我们要满足横向的 \(\tt Y\) 个数和恰好为 \(2q\),竖着恰好为 \(2p\)。然后我们先贪心分割(能分则分)出来一种方案,剩下的可以调整得到,在前缀和上体现为和不变。最后乘起来即可。
(E)
由于不能出现相邻 \(\tt Y\),于是可以得知 \(\tt Y\) 结点构成了一个独立集。
\(\tt YX\) 相当于 \(\tt Y\) 不在叶子上,也就是说有 \(\dfrac C2\) 个 \(\tt Y\) 不在叶子上。这意味着什么呢,如果根不是 \(\tt Y\),那么就有 \(B-\dfrac C2\) 个 \(\tt Y\) 在叶子上(根是 \(\tt Y\) 的话 \(+1\) 即可)。
于是我们可以大力 dp。设 \(f_{i,j,0/1}\) 表示以 \(i\) 为根的子树中,有 \(j\) 个叶子是 \(\tt Y\),并且 \(i\) 是/不是 \(\tt Y\),此时可以选出的最多的非叶子的 \(\tt Y\) 的个数。然后树上背包转移即可。小常数 \(O(n^2)\)。
记得判一堆 corner case,诸如 \(n=1\),\(2\nmid C\),\(B<\dfrac C2\) 等等。
**F
考虑 dp。设 \(f_{i,S}\) 表示考虑到 \(s\) 的前 \(i\) 位,且 \(S=t[p+1:i]\)(\(p\) 为 \(t\) 最后一次匹配的位置)时,字典序最大的答案,然后转移的时候枚举是否交换、匹配。
注意这里的状态是字典序最大,我们可以再在最高位前面加一个表示位数的 \(1\),这样求出字典序最大答案后,每一位反转后就是字典序最小的答案。
然而这样子的时间复杂度是 \(O(n2^n)\) 的。
注意到,对于连续的三个位置 \(s[i:i+2],t[i:i+2]\),通过枚举后可以发现,无论如何我们都可以使得 \(\operatorname{LCS}(s[i:i+2],t[i:i+2])\ge 2\)。也就是说,答案一定不小于 \(2\cdot\left\lfloor\dfrac n3\right\rfloor\),也就是说,我们状态中的 \(S\) 只有 \(|S|\le\left\lceil\dfrac n3\right\rceil\) 的是有用的。于是时间复杂度变为 \(O(n2^{\frac n3})\)。
ARC158
(A)
将操作 \(-5\),就变成了 \(+2,+0,-2\),可以看作从一个数中取一个 \(2\) 到另一个数内,最终都变成平均数。于是判奇偶性后相对顺序减一下即可。
B
为什么都有数学直觉啊??
对原式变形:
枚举 \(j\),那么要最值化这个式子,\(\dfrac1{x_i},\dfrac1{x_k}\) 只能是最值,维护前后缀最值即可。
C
为什么都会这种题啊??我怎么看了半天都不会做 /ll。
设 \(w(x,y)\) 表示 \(x+y\) 的进位次数。
于是有 \(f(x+y)=f(x)+f(y)-9\cdot w(x,y)\)。
那么原式就可以转化:
那么只要算 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^nw(a_i,a_j)\) 即可。
咋算呢。若 \(a_i+a_j\ge10^k\),那么就会在从低到高第 \(k\) 位发生一次进位。于是枚举,将取末若干位的 \(a_i\) 排序,对于一个 \(a_i\) 二分一个最小的可以进位的 \(a_j\) 算贡献即可。
这题不简单吧???为什么是绿题???
*D
神人题目。
发现两侧的齐次多项式次数差 \(1\),设有整数 \(t\) 使得:
两侧同除以 \(t^{3n+1}\),可以得到:
也就是说如果有一组存在 \(t\) 的 \((x,y,z)\),那么 \(\left(\dfrac xt,\dfrac yt,\dfrac zt\right)\) 就是答案。
\(p\) 是质数啊,所以看起来我随一组出来不合法的概率也不大的啊。那确实也不大,按官方题解的说法,合法概率大约为 \(\dfrac34\),期望 \(\dfrac53\) 次就能随出一组答案。
E
考虑分治。令 \(\text{mid}=\left\lfloor\dfrac{l+r}2\right\rfloor\)。然后我们计算跨越 \(\text{mid}\) 的点对的最短路之和。
设 \(f_{i,j,0/1}\) 表示 \((i,j)\) 到 \((\text{mid}+[i>\text{mid}],0/1)\) 的最短路。于是对于 \((i,x)\) 到 \((j,y)\)(其中 \(l\le i\le\text{mid}<j\le r\),\(0\le x,y\le 1\))的最短路,即为 \(\min(f_{i,x,0}+f_{j,y,0},f_{i,x,1}+f_{j,y,1})\)。
那么区间 \([l,r]\) 的答案可以列出,然后我们推一推式子:
后面那两个求和扫一遍就好了,主要还是前面这一坨。
令 \(g_{i,x}=f_{i,x,0}-f_{i,x,1}\),则前面这坨转化为:
那么我们可以将 \(g_{j,y}\) 排序并预处理前缀和后,然后枚举每个 \(g_{i,x}\) 时,二分出能够贡献答案的 \(g_{j,y}\) 的个数即可。
时间复杂度 \(T(n)=2T\left(\dfrac n2\right)+O(n\log n)\),即 \(O(n\log^2 n)\)。
**F
这也太难了吧???
对于每一数位来说,都会被操作零次或多次,然而这些操作,只有最后一次是对这个数位有用的。因此我们可以直接考虑一个长度为 \(k\) 的排列的答案,然后填入这 \(m\) 次操作里面计算最终答案。假设已经有了前者,那不难发现后者的系数就是第二类斯特林数,这个可以容斥算。
那前者怎么看排列的合法性呢。首先这个 \(b\) 的限制是 \(b_i\) 在 \(b_{i+1}\) 的左边。
设 \(b_{i,j}\) 表示 \(b_i\) 的十进制下从低到高第 \(j\) 位的数码。
怎么刻画这个限制呢。首先忽略 \(b_{i,x}=b_{i+1,x}\) 的情况。考虑 \(b_{i,x}\neq b_{i+1,x}\),将这些 \(x\) 划分成两个集合 \(S_i,T_i\),使得对于 \(x\in S_i\),有 \(b_{i,x}<b_{i+1,x}\);对于 \(x\in T_i\),有 \(b_{i,x}>b_{i+1,x}\)。
那么为了保证 \(b_i\) 与 \(b_{i+1}\) 的相对顺序,我们就需要保证 \(T_i\) 最后出现元素比 \(S_i\) 最后出现的元素要靠前。此外存在一个特殊情况是,如果 \(b_i\) 和 \(b_{i+1}\) 的相对顺序与他们对应到 \(a\) 内的顺序不同,那显然需要做至少一次 \(S_i\) 内的操作。
然后 dp。设 \(f_{u}\) 表示当前排列后缀构成集合为 \(u\) 的合法方案数。那么向这个集合中加入的 \(x\) 要满足 \(\forall x\in T_i,S_i\cap u=\varnothing\)。这个可以维护 \(S_i\) 的所有超集,然后判断这些超集里是否存在 \(\overline u\)。高维前缀和即可。
最后统计答案同样可以维护超集。
时间复杂度 \(O(n\log n+nk+2^kk^2)\)。
ARC159
(A)
显然 \(u\to v\) 的最短路径等于 \((u-1)\bmod n+1\to(v-1)\bmod n+1\) 的最短路径。Floyd 即可。
(B)
设 \(a=xg,b=yg\),那么一次操作后就变成 \(a=(x-1)g,b=(y-1)g\)。
\(g\) 只要 \(x\perp y\) 就不会变。考虑 \(g\) 变了的情况,设对同一个 \(g\) 做了 \(k\) 次操作,那么就会存在一个 \(d\) 满足 \(d\mid(x-k)\) 和 \(d\mid(y-k)\),也就是 \(x\equiv y\equiv k\pmod d\)。那显然我们有 \(d\mid (x-y)\)。于是枚举 \(x-y\) 的因子可以得到最小的 \(k\)。
时间复杂度 \(O(\sqrt n\log n)\)。
[C]
首先找到一些显然无解的情况。
最终的序列内数的总和显然是一个 \(n\) 的倍数。而我们每次会将序列总和增加 \(\dfrac{n(n+1)}2\)。若 \(2\nmid n\),那么一定有 \(n\left\vert\dfrac{n(n+1)}2\right.\),此时如果初始总和不是 \(n\) 的倍数就无解;若 \(2\mid n\),那么一定有 \(\left.\dfrac n2\right\vert\dfrac{n(n+1)}2\),初始总和不是 \(\dfrac n2\) 的倍数就无解。
发现对于 \(2\mid n\) 时,只要加入一个排列,就可以使得总和变成 \(n\) 的倍数。接下来考虑如何对满足这种条件的序列构造。
发现假设一次加入 \(\{1,2,3\cdots,n\}\),一次加入 \(\{n-1,n,n-2,\cdots,1\}\),两次相加的总和为 \(\{n,n+2,n+1,\cdots,n+1\}\),考虑相对差值,这相当于对一个数 \(-1\),一个数 \(+1\)。于是直接模拟调整即可,最终必然有解。
(D)
设 \(f_i\) 为以 \(r_i\) 结尾的 LIS,则显然有转移式:
值域线段树维护即可。
E
深感到自己是弱智。
首先显然这是一个带权的二分过程,由于 \(2\min\{a_i,b_i\}\ge\max\{a_i,b_i\}\),所以树高是 \(\log\) 级别的。
考虑将这个二分的过程变成一棵 BST,即将当前区间 \([l,r]\) 的 \(\text{mid}\) 和 \([l,\text{mid}-1],[\text{mid}+1,r]\) 的 \(\text{mid}_1,\text{mid}_2\) 相连边。那么 \(x_i\) 就对应到 \(i\) 在树上的深度。于是询问就变成了 \([c,d]\) 内编号相邻的两个点的深度差之和。
容易计算,这东西等于 \([c,d]\cup\text{root}\) 的虚树的边数和,\(\times2\) 后再减去 \(\text{dep}_l+\text{dep}_r\)。这些东西都可以直接搜。时间复杂度 \(O(q\log n)\)。
*F
显然一个好的序列当且仅当不存在绝对众数。
设 \(\operatorname{abmode}(l,r)\) 表示 \(a[l:r]\) 的绝对众数,若不存在,则 \(\operatorname{abmode}(l,r)=0\)。
那么就容易有暴力 dp。设 \(f_i\) 表示前 \(i\) 个数的答案,则 \(f_i=\sum\limits_{j=1}^{i-1}[\operatorname{abmode}(2j+1,2i)=0]f_j\)。对于一个区间 \([l,r]\),其所有子区间本质不同的绝对众数最多只有 \(\log\) 种。考虑枚举绝对众数,则上式可以变为:
考虑分治。
在区间 \([l,r]\) 时,考虑计算 \(f[l:\text{mid}]\) 对 \(f[\text{mid}+1:r]\) 的贡献。假设枚举了绝对众数 \(k\),那么可以将 \(a_i=k\) 的位置变为 \(1\),\(a_i\neq k\) 的位置变为 \(-1\),然后在这个区间内做一个前缀和,设为 \(s_{k,i}\),那么对于 \(i\in[\text{mid}+1,r]\),转移式子可以写作:
需要枚举的 \(k\) 是可以直接预处理 \([l,\text{mid}]\) 的后缀和 \([\text{mid}+1,r]\) 的前缀。然后后面这个 \(s_{k,i}>s_{k,j}\) 的限制可以 BIT 维护。这样子是 \(T(n)=2T\left(\dfrac n2\right)+O(n\log^2n)\) 的,即 \(O(n\log^3n)\)。
然而注意到 \(s_k\) 的值域范围很小,于是可以直接预处理一个 \(g_k\) 出来:
于是时间复杂度变为 \(T(n)=2T\left(\dfrac n2\right)+O(n\log n)\),即 \(O(n\log^2n)\)。
ARC160
(A)
直接从高位到低位考虑每一位可能的数即可。
[B]
我发现我很容易在 arc 的数学题犯糖,怎么回事啊……
不妨设 \(x\le y\le z\),则 \(y^2\le yz\le n\),故 \(y\le \sqrt n\)。
那么可以枚举 \(y\),并且由于有 \(x\in[1,y],z\in\left[y,\dfrac ny\right]\),并且始终有 \(xz\le n\),那么这些贡献都能显然算出来。讨论一下相等的数即可。时间复杂度 \(O(t\sqrt n)\)。
(C)
设 \(f_{i,j}\) 表示考虑 \(\le i\) 的数,且当前 \(i\) 有 \(j\) 个的方案数。显然可以直接向后转移。这东西看起来是 \(O(n^2)\) 的,但是有用状态很少,只转移有用的状态即可。这东西应该是 \(O(n)\) 级别的。
D
显然 \(k\nmid m\) 时无解。
然后倒过来,减变成加。考虑是否存在一种操作序列使得可以和一种合法方案一一对应。
由于一个位置被 \(k\) 次 \(+1\) 等价于做一次单点 \(+k\)。所以可以钦定每个区间做不超过 \(k-1\) 次的 \(+1\)。
于是设一个操作序列 \(q\),\(q[1:n-k+1]\) 是对每个区间 \(+1\) 的次数,\(q[n-k+2:2n-k+1]\) 是对每个位置 \(+k\) 的次数,于是需要满足:
- \(\sum\limits_{i=1}^{2n-k+1}q_i=\dfrac mk\)。
- \(\forall i\in[1,n-k+1],q_i\in[0,k)\)。
这东西是有上界的插板。考虑容斥,钦定有 \(i\) 个位置不合法,其他的任意,那么最终答案式子即为:
E
首先显然每个叶子都需要被连到。若叶子个数为偶数,那么可以将叶子两两连边,具体的构造方案是经典的(P4665),即按 \(\text{dfn}\) 升序排列得到叶子 \(a_1,a_2,\cdots,a_k\) 后连接 \(a_x\) 和 \(a_{x+\frac k2}\)。
那奇数怎么办呢。考虑枚举那个剩下的叶子,手画一下可以发现它可以连接到其祖先的第一个三度点以外的所有节点。
于是判掉链后取一个三度点为根节点开始搜即可。
*F
考虑刻画排列有序的方式。
将一个排列 \(p\) 拆分为 \(n\) 个 \(\tt 01\) 序列,第 \(i\) 个序列 \(a_i\) 满足 \(a_{i,j}=[p_j\ge i]\)。那么排列有序等价于对应的 \(\tt 01\) 序列有序。
然后发现 \(a_i\) 顺次下来相当于在一个 \(n\) 维空间从 \((0,0,\cdots,0)\) 走到 \((1,1,\cdots,1)\),于是可以直接做路径计数的 dp。
如果每次修改都要重新 dp 一下那还是很爆,但是你发现,只有对答案影响的修改才需要重新 dp。而对答案有影响的修改 \((x,y)\) 当且仅当存在一个 \(a_i\) 满足 \(a_{i,x}>a_{i,y}\),记录一下当前有哪些 \(\tt 01\) 序列执行 \((x,y)\) 的修改是有效的即可。
时间复杂度 \(O(2^nn^3)\)。
ARC161
(A)
贪心,升序排序后前一半放奇数位,后一半放偶数位,check 一下合法性即可。
(B)
贪心,\(\operatorname{popcount}(n)\ge3\) 则取高三位 \(1\) 即可,否则取 \(n-1\) 或 \(n-3\) 的高三位 \(1\)。
(C)
发现叶子是唯一确定的,于是从叶子往根做即可。
(D)
首先显然 \(nd>\dfrac{n(n-1)}2\) 时无解。
然后可以直接猜出来的一个构造是,将 \(x\) 连向 \((x\bmod n)+1\sim((x+d-1)\bmod n)+1\) 就可以了。
证明的话,考虑到,下标循环连续的 \(k\) 个点的边数肯定是比不连续的 \(k\) 个点的边数多的,于是只要证明前者合法。发现 \(k\) 变成 \(k+1\) 时,会新加入 \(1\) 个点和 \(\min\{k,d\}\) 条边。如果每次加入的都是 \(d\) 条边,那么该导出子图的密度就恰好是 \(d\),然而会出现 \(k<d\),因此一定合法。
**E
这也太变态了。
首先证明一定有解。
设初始颜色序列 \(c\in S\) 映射到最终的颜色序列为 \(c'\in T\)。若 \(|S|>|T|\),那么显然就会存在未被映射到的颜色序列。如果这个成立那么就有解。
\(n<10\) 的情况枚举可得,下面阐述 \(n\ge 10\) 的情况。
令 \(e(x)\) 表示与点 \(x\) 直接相连的点的集合。设有一个点 \(x\),\(e(x)=\{u,v,w\}\),那么有 \(e(u)=\{x,u_1,u_2\},e(v)=\{x,v_1,v_2\},e(w)=\{x,w_1,w_2\}\)。
如果说 \(c_{u_1}=c_{u_2},c_{v_1}=c_{v_2},c_{w_1}=c_{w_2}\),那么可以唯一确定 \(c'_u=\lnot c_{u_1},c'_v=\lnot c_{v_1},c'_w=\lnot c_{w_1}\)。这三个都被唯一确定了,那么 \(c'_x\) 也是唯一确定的。
那么此时发现,\(c_x\) 的值不影响 \(c'\)——换句话说,这个时候至少有 \(2^{n-6}\) 种不同的 \(c\) 对应着相同的 \(c'\)。
也就是说,如果我们随机一个 \(c\),那么其无解的概率 \(\ge\dfrac 1{64}\)。事实上,根据官方题解的说法,这个概率大得多(\(\approx0.48\))。不过我们估计的概率已经足以证明,我们可以 \(O(1)\) 次随出一个合法方案。
那么现在的问题就是要如何 check 合法性。
考虑一下,我们的限制形如,设有节点 \(x\) 以及 \(e(x)=\{u,v,w\}\),「若 \(c'_x\neq c_u\),则 \(c'_x=c_v=c_w\)」(轮换同理)。2-SAT 即可。
**F
做 D 的时候就很好奇 checker 怎么写,怎么放 F 来了。学了 mzx\(Purslane\) 大蛇的做法。
首先对于不连通的情况,抽屉原理可得,一定存在一个密度 \(\ge d\) 的导出子图。故直接判掉。
接下来需要一个前置内容:最大密度子图问题。即如果要求的是 \(|E'|\le d\cdot|V'|\) 的话,我们直接求出 \(\max\{|E'|-d\cdot|V'|\}\),看是否 \(\le 0\)。
然而本题中,整个图就能让这个式子 \(=0\)。换句话说,我们需要再找到一个真导出子图,使得其密度 \(=d\)。
于是问题就变成了「最小割是否唯一」,也就是求是否存在一组最小割,它割的不全是连接源(汇)点的边。
对于一条边 \((u,v)\) 能够被割,当且仅当,这条边满流,并且残量网络不存在 \(u\to v\) 的增广路。后者相当于 \(u,v\) 是否在同一个 SCC 内,这两者是等价的。于是跑一个 Dinic 和一个 Tarjan 即可。
ARC162
(A)
对于一对 \((i,j)\ (i<j)\),若 \(p_i>p_j\),那么这个时候,\(p_i\) 的返程速度一定比 \(p_j\) 快,因此 \(p_j\) 不可能成为冠军。于是答案就是 \(p\) 不同的后缀最小值个数。
(B)
直接找最小数插到前面即可。如果在最后一个就拿前面未处理的数插到后面,这样肯定不超过 \(2n\) 次。操作不了就是无解。
(C)
显然 Bob 一定填 \(k\),所以如果存在子树的 \(\text{mex}\) 恰好为 \(k\),或者有一个空缺且存在一个数填进去后能使 \(\text{mex}\) 为 \(k\),那么 Alice 必胜,否则 Bob 必胜。
D
哦不,这个第一步我不会。我是弱智吗。
首先对于一棵 \(n\) 个点的有标号无根树,如果确定了 \(\deg_i\),那么可能的无根树数量即为 \(\dfrac{(n-2)!}{\prod\limits_{i=1}^n(\deg_i-1)!}\)。可以用 Prüfer 序列证。
回到本题,考虑对每个节点算贡献,那么对于叶子和根,所有的树都是符合要求的,于是它们的贡献分别都为 \(\dfrac{(n-2)!}{(d_1-1)!\prod\limits_{i=2}^nd_i!}\)。
接下来考虑一个非叶子节点 \(x\)。
其子树相当于还要在 \([x+1,n]\) 中选取一个子集 \(S\),并且要求 \(S\cup x\) 构成一棵树。这个相当于要满足 \(d_x+\sum\limits_{i\in S}d_i=|S|-1\)。
那么这个时候,\(x\) 子树内的方案数即为 \(\dfrac{(|S|-1)!}{(d_x-1)!\prod\limits_{i\in S}d_i!}\)。
然后对于 \(x\) 子树外,可以直接将 \(x\) 子树并起来,这样就相当于是这棵树的一个叶子,于是方案数即为 \(\dfrac{(n-|S|-2)!}{(d_1-1)!\prod\limits_{i\notin S\cup\{x,1\}}d_i!}\)。
这时的总贡献即为:
于是考虑 dp。设 \(f_{i,j,k}\) 表示当前考虑了 \([i,n]\),选择了 \(j\) 个点,这 \(j\) 个点的 \(d\) 之和为 \(k\) 的方案数,转移显然。然后可以直接拿上式算答案。
时间复杂度 \(O(n^3)\)。
*E
不是,这题真的很难吧!!!为什么题解区都讲的这么轻松??
首先思考如何刻画这个填数,显然无法记录下具体填了什么。那咋办。然后我也没见过这种。
设 \(\text{cnt}_i\) 表示 \(i\) 的出现次数。
注意到(其实我也不知道大家是怎么注意到的)如果按照 \(\text{cnt}\) 降序去填数,那么这个时候,假设现在考虑出现次数为 \(i\) 的数,如果要让一个 \(j\) 有 \(\text{cnt}_j=i\),那么有 \(a_j\ge i\),并且对于每个填入的位置 \(k\) 满足 \(a_k\ge i\)。
那这样的话,我们发现我们无需关心每个位置填了什么,因为按照这种限制填,更小的 \(\text{cnt}\) 限制更宽,而我们只考虑更紧的限制,从而不产生后效性。
我们只关心:
- 满足 \(a_j\ge i\) 的正整数 \(j\) 的个数 \(c_i\)。
- \(b\) 已经被填了多少种数。
- \(b\) 已经被填了多少个数。
于是可以 dp。设 \(f_{i,j,k}\) 表示考虑了最终 \(\text{cnt}\ge i\) 的数,已经填入了 \(j\) 种数、\(k\) 个数的方案数。然后枚举 \(\text{cnt}=i\) 的数的个数 \(x\)。贡献的系数即为从未选的 \(c_i-j\) 个数中取 \(x\) 出来,填入 \(c_i-k\) 个空中,做可重集排列。转移式子即为:
由于 \(j,x\le\dfrac ni\),所以时间复杂度是 \(O(n^3)\) 的。
(F)
我擦,我居然自己做出来了。
首先当然是刻画条件,这个 \(A_{a,b}A_{c,d}\le A_{a,d}A_{b,c}\) 的限制等价于:若 \(A_{a,b}=A_{c,d}=1\ (a<c\land b<d)\),则 \(A_{a,d}=A_{b,c}=1\)。
继续尝试刻画。考虑去掉那些全 \(\tt 0\) 的行列,那么此时如果 \(A_{a,b}=A_{c,d}=1\),那么 \((a,b),(c,d)\) 以内的矩形就都是 \(\tt 1\)。
那这个时候的矩阵满足什么条件呢。它会长成像这样子:

也就是说,每行只有一个连续段 \([l_i,r_i]\),并且有 \(l_i\le l_{i-1}\le r_i\le r_{i-1}\)。
那我们可以直接大力 dp 了。设 \(f_{i,j,k}\) 表示考虑了前 \(i\) 行,且 \(l_i=j,r_i=k\) 对应的方案数。转移式子即为:
显然直接前缀和优化转移可以做到 \(O(n^3)\)。边界即为 \(f_{1,j,m}=1\)。
然后考虑 \(f_{i,j,k}\) 对答案的贡献。现在相当于在其中插入 \(n-i\) 个空行和 \(j-1\) 个空列,也就是从 \(n\) 行 \(m\) 列中选择 \(i\) 行 \(m-j+1\) 列出来,钦定它们非空。那么贡献即为 \(f_{i,j,k}\cdot\binom ni\cdot\binom m{m-j+1}\)。于是时间复杂度依旧为 \(O(n^3)\)。
ARC163
(A)
显然只需要判能否划分成两个串,枚举即可。
(B)
显然只改 \(a_1,a_2\) 是不劣的。将 \(a_{3\sim n}\) 升序排序后枚举长度为 \(m\) 并且包含 \([a_1,a_2]\) 的区间比较即可。
(C)
根据小学数学可得,因为 \(\dfrac1{x(x+1)}=\dfrac 1x-\dfrac1{x+1}\),所以可以构造 \(\dfrac 1{1\times2}+\dfrac1{2\times 3}+\dfrac1{3\times4}+\cdots+\dfrac1{(n-1)n}+\dfrac1{n}=1\)。
当然这样可能会存在一个正整数 \(k\) 满足 \(n=k(k+1)\),这个时候咋办呢,考虑 \(n-1\) 项显然还是能构造的,那么就先有 \(\dfrac 1{1\times2}+\dfrac1{2\times 3}+\dfrac1{3\times4}+\cdots+\dfrac1{(n-2)(n-1)}+\dfrac1{n-1}=1\),然后我们灵机一动,全体 \(\times\dfrac12\),然后再加一个 \(\dfrac12\),于是就是 \(\dfrac 12+\dfrac1{2\times1\times 2}+\dfrac1{2\times2\times 3}+\cdots+\dfrac1{2(n-2)(n-1)}+\dfrac1{2(n-1)}=1\),就做完了。
不过这东西 spj 要咋写啊,感觉不是很好写啊。
D
首先抛出我不会的引理:
将竞赛图中的点集划分为两个可空集合 \(S,T\),一种划分是好的当且仅当对于 \(\forall x\in S,\forall y\in T\),存在边 \(x\to y\)。则好的划分的个数等于竞赛图内 SCC 个数 \(+1\)。
证明:
将竞赛图缩点,这样可以得到一条广义链 \(a_1,a_2,\cdots,a_n\)。若存在一个 \(i\in[1,n)\),满足 \(a_i\in T,a_{i+1}\in S\),那么这时因为有边 \(a_{i+1}\to a_i\),故不合法。
也就是说,一种好的划分只能是找到一个 \(k\in[0,n]\),令 \(S=\{a_i\mid i\in[1,k]\},T=\{a_i\mid i\in[k+1,n]\}\)。这样一个 \(k\) 和一组划分方案一一对应,共有 \(n+1\) 种,减去 \(1\) 后即为 \(n\),也就是图内的 SCC 个数。
这个刻画其实看起来还是相当显然的,那这个能怎么用呢。
我们现在就相当于在对划分方案计数了。于是 dp,设 \(f_{i,j,k}\) 表示考虑了编号为 \(1\sim i+j\) 的点,其中 \(i=|S|,j=|T|\),已经有 \(k\) 条边 \((u,v)\) 满足 \(u<v\),对应的划分方案数。
向后转移,现在新加入一个点 \(p=i+j+1\)。
-
如果 \(p\in S\),那么它必须连向 \(T\) 内的所有点(并且这些边不满足 \(u<v\)),然后对于 \(S\) 内的连边是任意的,设有 \(x\) 条边满足 \(u<v\),则有转移式:
\[f_{i+1,j,k+x}\stackrel+\gets f_{i,j,k}\cdot\binom ix \] -
如果 \(p\in T\),那么 \(S\) 内的所有点必须连向它(并且这些边都满足 \(u<v\)),然后对于 \(T\) 内的连边是任意的,设有 \(x\) 条边满足 \(u<v\),则有转移式:
\[f_{i,j+1,k+i+x}\stackrel+\gets f_{i,j,k}\cdot\binom jx \]
最终答案即为 \(\left(\sum\limits_{i=0}^nf_{i,n-i,m}\right)-\binom{\binom n2}m\\\),后面这个减是因为由引理可得我们的转换求解之间差 \(1\),而每种竞赛图又都会各多贡献 \(1\),于是减去竞赛图个数即可。时间复杂度 \(O(n^3m)\)。
**E
这是题???
首先考虑 \(n=2\) 的情况。然后你大力打个表:
大力观察一下:
哇是分形!
然后你注意到(?),对于 \(n=2\) 时,先手必胜当且仅当四进制下存在一个数位恰好只有一个非零数码。然后这东西可以直接拓展到 \(n>2\) 的情况。
证明吗,这个我不太会。官方题解应该有说明,洛谷题解区也有,感兴趣的看下吧。主要是这东西价值感觉不是太大。
**F [未做]
不会 poly,再说吧。
ARC164
(A)
转三进制,个数少就拆,判一下即可。
(B)
容易发现合法当且仅当存在一个只有一条同色边的奇环,于是保留异色边,枚举同色边,判是否在同一连通块,并查集即可。
[C]
哦不,我怎么不会贪心。那我来严肃学一下 @TernaryTree 的线性做法吧。
考虑 Bob 选择的牌初始所在的面,设目前还需要选 \(x+y\) 个数,且有 \(x\) 个初始在红色面、\(y\) 个初始在蓝色面。当 Alice 操作一次时,\(x\) 会 \(\pm1\),然后 Bob 取走一张牌后 \(x\) 相较于 Alice 操作前,要么不变要么 \(-2\)。也就是说 \(x\) 奇偶性始终不变。
考虑如果 \(x\) 初始是奇数,那么 Alice 可以操作一下就使得方案不成立了。
于是最终答案相当于是在 \(a\) 中取偶数个,剩下的取 \(b\) 的最大值。
f然后直接 dp。设 \(f_{i,0/1}\) 表示前 \(i\) 个数取了偶/奇数个 \(a\) 的最大值,于是有转移式子:
时间复杂度 \(O(n)\)。
D
哦不,我真是弱智吧,这种题不会么。
下文所说的「和」都是指正电荷数减去负电荷数。
首先观察,一个电荷的移动方向是两侧的正负电荷之和的差决定的。而如果一个电荷一侧的一对正负电荷相撞后消失,则不会影响这一侧的和。也就是说,电荷自始至终的移动方向都不变。
然后可以直接大力 dp。设 \(f_{i,j}\) 表示对于前 \(i\) 个电荷,和为 \(j\) 的方案数,那么显然有转移:
然后设 \(g_{i,j}\) 表示对于前 \(i\) 个电荷,和为 \(j\) 的所有方案的总移动距离。
考虑贡献。当前最后会有 \(|j|\) 个电荷未消失,然后我们每向后考虑一位就会多移动一个单位,于是贡献即为 \(f_{i,j}\cdot|j|\)。故转移式子为:
最终答案即为 \(g_{2n,0}\)。时间复杂度 \(O(n^2)\)。
E
首先,如果有询问区间 \([l,r]\),那么搜索树上在这个区间两侧必然有断点。这样找出所有断点,将 \([1,n]\) 切割成 \(k\) 个区间。由于第 \(i\) 层最多有 \(2^{i-1}\) 个节点,所以搜到的最浅深度 \(d\) 就满足 \(2^d\ge k\),于是 \(d_\min=\lceil\log k\rceil\)。
接下来考虑最小化 \(c\)。
对于这层所有切割出的区间,我们有两种决策:
- 将区间向上放一层,这样没有贡献。
- 将这个区间和前一个区间合并成一个 \([l,r]\),并上放一层。那么此时,对于所有被 \([l,r]\) 包含的询问区间,都会产生 \(2\) 的贡献。贡献的计算,考虑枚举断点,统计左、右端点是该断点的询问区间数即可。
于是有 dp,设 \(f_{i,j}\) 表示考虑断点切割的第 \(i\) 个区间,且上一层有 \(j\) 个区间产生了贡献的答案。转移为:
其中 \(w(i)\) 表示第 \(i\) 个断点产生的贡献。
时间复杂度 \(O(n^2+q)\)。
*F
由于最后每个节点都需要放置一个棋子,所以每个节点上的棋子被翻转的次数相同。双方放的棋子颜色又是定的,然后再进行转化(这是容易的),可以得到,双方相当于都是要尽可能少地取奇数深度的节点。
那这个相当于一个在删叶子的过程。现在轮到某一方,则它必然会考虑:
- 如果存在偶数深度的叶子,就删这个。
- 如果不存在,那么不得不删奇数深度的叶子。在这个过程下:
- 如果某个叶子是其父亲的唯一一个儿子,那么删掉这个叶子后对方就又能删去一个偶数深度的儿子,对自己来说是劣的。因此会先删父亲的儿子数量 \(>1\) 的叶子。
- 这样最后就剩下一堆儿子唯一的父亲的叶子。那这时为了不再变劣,则需要找到一个离某一个儿子数 \(>1\) 的祖先最近的叶子,然后这样删去。
直接模拟这个过程是 \(O(n^2)\) 的,考虑优化。
首先,某一方出现第二种情况时,当然希望尽快操作结束,因此可以考虑成这样一个不劣的策略:找到一个最小的子树,满足其父亲为儿子数 \(>1\) 的偶数深度节点。将这个子树操作完后,先后手相当于进行了互换。
事实上,这个操作等价于,取出树上的一个最小的合法的簇并删去。于是 dfs 一下划分树的簇即可。时间复杂度 \(O(n\log n)\)。
ARC165
(A)
等价于是否存在两个不同的质因子,如果要构造的话可以放在序列里后,一直放 \(1\) 来补。
[B]
想了一半犯糖了。
显然修改后不会让字典序变大,因此我们肯定尽量保留原序列内数的顺序,而这当然是我们选择的一个前缀。
首先钦定我们选择了 \([n-k+1,n]\) 这个区间,设我们最终选择 \([l,r]\) 这个区间(显然 \(l\le n-k+1\),\(r\le n\)),那么一定有 \([l,n-k]\) 中的所有数都小于 \([n-k+1,r]\) 中的数,而且 \([l,n-k]\) 当然是升序的。那这样子我们向前尽可能滑动区间即可,过程可以用 set 维护。可以把存在长度 \(\ge k\) 的递增区间的情况特判掉。
[C]
我靠,我真是弱智吧,这种水平怎么打偶爱。
显然要二分答案,设当前 check 的是 \(w\)。然后由于是黑白染色,对于一组边 \((x,y,w_1),(y,z,w_2)\),若 \(w_1+w_2<w\),那么枚举一下即可得到,此时一定无解。
判掉这个后,你就发现所有长度 \(>2\) 的路径也一定是合法的,于是只要看每条边,那这个可以保留所有边权 \(<w\) 的边,做一遍黑白染色后,判断是否为二分图即可。
D
我觉得这题挺好的。
首先判掉 \(a_i=c_i\) 的情况。接下来,贪心地想,我们一定希望一个约束尽量靠前地满足,这样留给后面的自由度更高。这样就可以连边,\(a_i\to c_i\) 表示要求 \(x_{a_i}\le x_{c_i}\)。
然后考虑这个建出来的图。我们可以针对 SCC 看。SCC 内的点必须相同,然后将 SCC 缩起来后,可以按照拓扑序给序列 \(x\) 赋值。
因此,对于一个约束 \((a_i,c_i)\),如果 \(a_i,c_i\) 不在同一 SCC 就一定合法;如果在同一 SCC,那么这时有 \(x_{a_i}=x_{c_i}\),只能向后找,于是在这个图的基础上同时连所有需要连的边 \((a_i+1)\to(c_i+1)\),继续跑 SCC,直到到达限制区间的边界。
这样时间复杂度就是 \(O((n+m)n)\)。
*E
由于多次操作一个点是没有意义的,于是和 ARC158F 的第一步类似,我们可以将操作过程这么刻画:生成一个排列出来,然后按照排列依次看这个点,如果所在连通块大小 \(>k\) 就删,否则不管。那么原问题的答案,就是这个排列上被操作的点的个数的期望。
考虑一个以 \(x\) 为根的连通块,大小为 \(i\),如果说这样一个连通块会产生,那么和该块相邻的 \(j\) 个点都需要在 \(x\) 之前删掉。这 \(i+j\) 个点以外的点都没有影响。那么对于这些点,总共有 \((i+j)!\) 种排列,而 \(j\) 个点先删的有 \(i!j!\) 种,故概率为 \(\dfrac{i!j!}{(i+j)!}=\dfrac1{\binom{i+j}{j}}\)。
于是考虑 dp,设 \(f_{u,i,j}\) 表示以 \(u\) 为根的连通块大小为 \(i\),与之相邻的有 \(j\) 个点的连通块数。这里为了方便操作,\(j\) 是不考虑 \(u\) 的父亲的,于是可以树上背包转移。设 \(u\) 的儿子为 \(v\),对应枚举的大小和相邻点数为 \(x,y\),则有:
初值 \(f_{u,1,0}=1\)。由于 \(u\) 不选任何儿子也是会有相邻点的,于是还有 \(f_{v,0,1}=1\)。
最终计算的答案,就是将所有的连通块产生的贡献加起来,即:
里面有个 \([i\neq 1]\) 是在特判前面没考虑的父亲。
F
首先考虑两个数 \(i,j\) 的两个端点 \((l_i,r_i),(l_j,r_j)\) 的分布情况:
- \(l_i<r_i<l_j<r_j\):此时当然不会改变他们在最终序列中的相对顺序,否则肯定变劣。
- \(l_i<l_j<r_i<r_j\):此时将 \(i\) 排在前面当然是比 \(j\) 排在前面更优的。
- \(l_i<l_j<r_j<r_i\):此时要么将 \(l_i\) 移到 \(r_j\) 右侧,要么将 \(r_i\) 移到 \(l_j\) 左侧,二者是等价的,所以两种顺序都可以。
综上的话,只有前两种可以确定 \(i,j\) 在最终答案中的顺序,满足的条件即为 \(l_i<l_j\land r_i<r_j\)。连边 \(i\to j\) 表示 \(i\) 必须排在 \(j\) 前面,那么这样直接跑最小拓扑序即可。
然而这样的连边是 \(O(n^2)\) 的,考虑优化连边。
首先将所有二元组端点按 \(l_i\) 升序排列。然后考虑分治,\(\text{sol}(x,y)\) 表示对下标在 \([x,y]\) 的点连边。先向下递归 \(\text{sol}(x,\text{mid}),\text{sol}(\text{mid}+1,r)\),完成他们内部的连边。然后考虑跨越 \(\text{mid}\) 的要如何处理。由于最初已经按照 \(l_i\) 排序,那么 \(l_i<l_j\) 的要求已经满足,只需要考虑 \(r_i<r_j\) 的约束。
如果将 \([\text{mid}+1,r]\) 按照 \(r_i\) 升序,那么每枚举一个 \(i\in[l,\text{mid}]\),就只需要对一个 \([\text{mid}+1,r]\) 的后缀连边。建立一个虚点连边即可。至于按照 \(r_i\) 升序,是可以直接归并排序的,并且 \([l,\text{mid}]\) 的顺序不影响连边。
这样这个图的边数就降到了 \(O(n\log n)\) 级别。最后再在这个图上做拓扑排序即可。注意由于要最小化字典序,我们需要优先拓展虚点,来尽可能地得到编号更小的点。时间复杂度 \(O(n\log n)\)。
ARC166
(A)
按照 \(Y\) 的 \(\tt C\) 分段,看每一段 \(\tt A,B\) 个数能否相同即可。
(B)
对每个 \(a_i\) 求一下成为 \(a,b,c,ab,bc,abc\) 倍数的最小代价,然后枚举几个代价较小的取最优即可。
(C)
一种标记结果唯一对应一种标记方案。考虑斜向拆出 \(\tt LULULU\cdots\) 的折线出来,然后可以 dp 一下。以一对 \(\tt LU\) 为一组,并且对应一个正方形,设 \(f_{i,0/1/2}\) 表示考虑了前 \(i\) 组,第 \(i\) 组被标记情况是未标记 / 标记 \(\tt LU\) / 标记第 \(i\) 组的 \(\tt D\) 和第 \(i+1\) 组的 \(\tt R\),然后可以简单转移:
对于矩形拆出的折线,可以分为三部分,左上和右下的等腰直角三角形的部分都是一个 \(f_{i,0}+f_{i,1}\) 的前缀积。中间的平行四边形是一个 \(f_{\min(h,w),0}+f_{\min(h,w),1}+f_{\min(h,w),2}\) 的幂次。时间复杂度 \(O(n+T\log V)\)。
D
降智了。
问题相当于是每次选择一个值域区间 \([l,r]\),对 \(x_i\in[l,r]\) 的位置做区间 \(-1\),然后问全部清零时 \(r-l\) 最小值的最大值。差分一下得到 \(x'_i\),就变成选择一对下标区间 \([l,r]\ (1\le l<r\le n)\),执行 \(x'_l\gets x'_l-1,x'_{r+1}\gets x'_{r+1}+1\)。最后清零时所有操作的区间最小的最大值。
这个看着很能二分啊,但是我做了好久做不了啊。但是这可以直接贪。从左往右扫,对于一个 \(x'_i>0\),往后找尽可能近的 \(x'_j<0\) 去消,因为这次不消的话后面消只会让操作的区间更短。这样就对了。时间复杂度 \(O(n)\)。
**E [未做]
我不会类欧。
**F [未做]
我不会数学分析。
ARC167
(A)
可以简单计算得到,假设有四个 \(a,b,c,d\) 满足 \(a<b<c<d\),需要两两匹配,则分成 \(a+d\) 和 \(b+c\) 一定最优。于是将原序列升序后将前 \(2(n-m)\) 个数首尾匹配即可。
[B]
若 \(A^B\) 不是完全平方数,那么存在一个因数 \(x\) 时必然存在一个不同的因数 \(\dfrac{A^B}{x}\),这样一对给答案贡献了 \(B\)。于是答案即为 \(B\cdot\dfrac{d(A^B)}2\)。
若 \(A^B\) 不是完全平方数,即此时 \(A\) 为完全平方数或 \(B\) 为偶数,那么 \(\sqrt{A^B}\) 会再贡献一个 \(\left\lfloor\dfrac B2\right\rfloor\)。
于是时间复杂度 \(O(\sqrt A)\),瓶颈在分解质因数。
C
数数真难吧。参考了 @min_inf 的做法。
首先重排 \(a_i\) 显然不影响答案。考虑对每个 \(a_i\) 算贡献。对于一个排列算 MST 的过程,即为从小到大枚举 \(a_i\),然后将 \([i-k,i+k]\) 内的所有连通块跟 \(i\) 连边,分别贡献一个 \(a_i\)。
有多少连通块会和 \(i\) 连边?容易发现 \(i\) 左右侧各至多一个。证明考虑钦定和 \(i\) 连边的是连通块内的最小数,如果一侧存在两个,那么这两个连通块内必然存在分别存在一个 \(<a_i\) 的数,而这两个数之间的距离 \(<k\),理论上先前应该连过,自然不合法。假设升序排列了 \(a_i\),当前考虑到 \(a_i\)。设 \(l=\max(1,i-k),r=\min(n,i+k)\),讨论 \(i\) 两侧连通块数量:
- \(0\) 个连通块:那么这时区间内的数都 \(\ge a_i\),于是相当于要在 \(a_{[i+1,n]}\) 中选 \(r-l\) 个数填满这个区间,方案数为 \(\binom{n-i}{r-l}(r-l)!(n-r+l-1)!\)。
- \(1\) 个连通块:这个直接算不太好算,考虑算出 \(0,2\) 个连通块的答案后用 \((n-1)!\) 减掉。
- \(2\) 个连通块:设与 \(i\) 匹配的这一对数的下标为 \((x,y)\ (x<i<y)\),那么 \([l,r]\) 这个区间相当于是除掉 \(x,y,i\) 的部分需要用 \(>a_i\) 的填满,\(x,y\) 需要用 \(<a_i\) 的填满,再乘上区间外的排列数。方案数即为 \(\binom{n-i}{y-x-2}\binom{i-1}2(y-x-2)!2!(n-y+x-1)!\)。
直接枚举 \(i,x,y\) 是 \(O(n^3)\) 的。注意到对于 \(x,y\) 我们只关心 \(y-x\),所以考虑枚举 \(y-x\in(k,n)\) 并计算一对 \((i,y-x)\) 对答案的贡献个数即可。每种方案都会贡献一个 \(a_i\)时间复杂度 \(O(n^2)\)。
(D)
问题等价于交换尽可能少的数,使得所有数都在 \(1\) 所在的置换环内。要最小化操作,意味着一次交换需要合并两个置换环。
考虑维护 \(1\) 所在置换环的集合,然后枚举最小的不在这个集合内的数 \(x\),现在需要将 \(x\) 和集合内的一个数交换,并且要尽可能最小化字典序。那么我们交换的数 \(y\) 肯定要尽可能满足 \(x<y\),并且 \(y\) 要在序列中排得尽可能前。用线段树维护集合内每个数在序列中所在的位置即可。如果不存在这个 \(y\),那就与集合内下标最大的数交换即可。时间复杂度 \(O(n\log n)\)。
(E)
又诡异又魔怔的构造题。
首先观察样例给的 \(S=4\) 的构造:

为了方便,我们钦定三个点的坐标为 \(B(0,0),A(0,2),C(2,2)\)。
如果我们沿着斜线 \(y=x\) 向上,那么这时仍然只有一个正方形:

上图的三角形面积为 \(3\),即 \(S=6\)。
以此类推,每次我们沿着斜线 \(y=x\) 向上一格,增加的面积都是形如下图的红色三角形:

它的底、高均为 \(\sqrt2\),所以增加的面积即为 \(2\)。
于是 \(2\mid S\) 时有可以构造 \(B(0,0),A(0,2),C\left(\dfrac S2,\dfrac S2\right)\),而 \(S=2\) 时似乎是无解的。
那 \(2\nmid S\) 时怎么办呢?
尝试手画一下,似乎 \(S\le 7\) 都没有解。这个包括前面这个 \(S=2\),其实我都不太会严谨地证明,希望有大手子教教如何严谨证明。
但总之我们可以得到如下一种 \(S=9\) 的构造:

类比 \(2\mid S\) 的情况,我们尝试将点 \(C\) 放在 \(y=x\) 上:

这时若 \(C\) 的坐标为 \((x,x)\),则 \(S_{\triangle ABC}=\dfrac 12\cdot\sqrt2\cdot\sqrt2x=x\),故 \(C\left(\dfrac S2,\dfrac S2\right)\)。事实上你也可以根据 \(2\mid S\) 时的构造将点 \(A\) 沿着平行于 \(y=x\) 的直线移动得到这种构造。
观察到 \(S=9\) 的时候,点 \(C\) 向右移动了一个单位。我们类似地移动一下:

显然(显然吗?)由于这个移动无法使得任意一个正方形在三角形内的格点数从 \(3\) 变成 \(4\),所以这样一个移动,三角形内部没有办法产生一个新的正方形。这时设 \(C\left(x,x-1\right)\),则可以大力割补法求得 \(S_{\triangle ABC}=\dfrac{(x-1)x}2-\dfrac32-\dfrac{(x-1)(x-4)}2-(x-4)=x+\dfrac12\)。故 \(C\left(\dfrac{S-1}2,\dfrac{S-3}2\right)\)。
**F [未做]
不会多项式。
ARC168
(A)
显然一段极长的 \(\tt>>\cdots>\),假设长度为 \(k\),必然会对答案造成 \(\binom{k+1}2\) 的贡献。同时,只要我们让每一段 \(\tt >\) 或 \(\tt <\) 之间段内最小值比前一段的最大值大,那么就不会额外造成贡献了。
[B]
首先显然地,根据 Nim 博弈的结论,若 \(\bigoplus a_i>0\),那么先手必胜,于是这个上界 \(k\) 就没有必要,也就不存在最大值。
否则按照原本的 Nim 博弈的规则必败,于是我们需要一个限制 \(k\) 来想办法让先手必胜。
首先假设存在两堆石子的个数相同,那么这时可以模仿另一人的行动来消去这两堆。这样剩下的石子堆个数互不相同。若被消完了那还是先手必败。
设剩下的石子堆中最大的为 \(x\),若设 \(k=x-1\),那么 \(x\) 必然可以被先手控制在两步消掉,而 \(<x\) 的石子堆依然可以看作是正常的 Nim 博弈。而这些剩下的石子个数异或和就 \(>0\) 了,所以先手必胜。
C
考虑交换字符的情况,即为 \(\tt AB,\tt BC,\tt AC\) 交换,以及 \(\tt BCA\) 和 \(\tt CAB\) 两种轮换。分别枚举前三种的交换对数,以及轮换的对数,分别对于每种轮换算出实际上的 \(\tt AB,BC,AC\) 交换对数,然后使用多重组合数计算即可。时间复杂度 \(O(n+k^4)\)。
D
感觉以前模拟赛做到过啊。但是我怎么大大地降智。
考虑对着被染色的序列做区间 dp。设 \(f_{l,r}\) 为给 \([l,r]\) 内的格子染色最多可以改变的状态数。考虑最后一次改变状态时被覆盖的白色格子 \(k\in[l,r]\),我们需要一个 \(g_{l,r,k}\) 表示格子 \(k\) 能否被一个区间 \([x,y]\in[l,r]\) 所染色。\(g\) 可以在读入区间 \([l,r]\) 的时候赋 \(i\in[l,r],g_{l,r,i}=\tt True\),然后按照区间长度向外拓展更新,即 \(g_{l,r,i}=g_{l,r,i}\lor g_{l+1,r,i}\lor g_{l,r-1,i}\)。
求得 \(g\) 后,\(f\) 就有状态转移式:
时间复杂度 \(O(n^3)\)。
*E
生气了,本来想对着恰好 \(k\) 个做 wqs 二分结果发现这东西根本不是凸的!!
假设序列的某一种划分得到了代价 \(w\),则一定可以得到代价为 \(w-1\) 的划分方案,也就是答案是单调的。考虑二分答案 \(w\),判断划分的段中有 \(w\) 个满足和 \(\ge s\) 时,能否划分出 \(\ge k\) 个段。
然后要开始刻画这个判定了,这个刻画真的难吧!!!
现在相当于,要选出 \(w\) 个段内总和 \(\ge s\) 的区间 \([l_i,r_i]\),然后贪心地,我们将未选的部分都变成单个数构成的区间。发现我们划分出的总区间数,可以刻画成 \(n-\sum\limits_{i=1}^w(r_i-l_i)\)。令 \(h(x)=\min\left\{\sum\limits_{i=1}^x(r_i-l_i)\right\}\),那二分的判定就有 \(n-h(w)\ge k\),即 \(h(w)\le n-k\)。
现在要单点求 \(h(w)\)。容易感受出来 \(h(x)\) 是上凸的,所以这个时候就可以 wqs 二分了。二分一个斜率 \(k_0\),要最大化 \(b_0=h(x)-k_0x\)。那么每选出一个区间就会有一个 \(-k_0\) 的额外贡献。
于是内部可以容易地 dp,设 \(f_i\) 表示扫到位置 \(i\) 时和 \(\ge s\) 的段的最小代价,\(g_i\) 为对应的区间个数。仍旧贪心地,设 \(p_i=\max\left\{x\left|\sum\limits_{j=x}^ia_i\ge s\right.\right\}\),则容易得到转移式:
\(g_i\) 从 \(f_i\) 对应的转移位置转移过来即可。时间复杂度 \(O(n\log n\log V)\)。
**F
这个好像前几周才被搬到联考啊!
考虑到整个操作的过程中,\(a_i\) 始终单调不降。考虑维护差分数组 \(d_i=a_i-a_{i-1}\)。那么最终所有数的和为 \(\sum\limits_{i=1}^m(m-i+1)d_i\)。
想一下怎么刻画操作。考虑维护一个堆,每次向堆中加入 \(d_i\) 个 \(m-i+1\)。操作完后将堆中的数求和。
这个将部分数 \(-1\) 操作似乎并不能很好地表现出来,考虑转化一下操作。
做第 \(i\) 次操作等价于先将 \(j\in(x_i,m]\) 的位置 \(+2\),然后再对全体 \(-1\),并对 \(0\) 取 \(\max\)。
- 对于后缀 \(+2\) 操作,相当于是执行 \(d_{x_i+1}\gets d_{x_i+1}+2\)。也就是向堆中加入 \(2\) 个 \(m-x_i\)。
- 对于全体 \(-1\) 并对 \(0\) 取 \(\max\) 的操作,相当于是从左到右,找到一个非零的 \(d_i\),执行 \(d_i\gets d_i-1\)。这个相当于在堆中删除了一个 \(m-i\),由于 \(i\) 要尽可能小,所以就等价于从堆中删去 \(1\) 个最大的数。
所以现在的问题就相当于要维护一个大根堆,最终要求堆内数的和。而 \(x_i\) 会修改,这个「最大数」并不好求。
考虑将问题弱化一下。我们将「删除最大数,求最终的和」转化成「删除任意数,最小化最终的和」。这显然是等价的。这样一个最小化问题,可以考虑构建费用流模型:
- \(S\overset{(2,m-x_i)}{\longrightarrow}i\),这个刻画了「加入 \(2\) 个 \(m-x_i\)」。
- \(i\overset{(+\infin,0)}{\longrightarrow}j\ (i<j)\),这个刻画了「在第 \(i\) 次操作中加入的数在第 \(j\) 次操作时被删除」。
- \(i\overset{(1,0)}{\longrightarrow}T\),这个刻画了「在第 \(i\) 次操作时删除 \(1\) 个数」。
对于第二种连边显然可以变为 \(i\overset{(+\infin,0)}{\longrightarrow}i+1\)。
于是答案即为最小费用最大流。接下来当然考虑模拟费用流。
我们会先找到一个最大流,然后找一个环去增广。可以增广的环必然是包含 \(S\) 的(因为包含 \(T\) 的环没有费用,不造成任何影响)。
一次对 \(x_i\) 的单点修改,当然只会增广一个包含 \(i\) 的环 \(S\to u\rightsquigarrow v\to S\)。\(i\) 一定是 \(u,v\) 之一,不然这个环在修改前增广一定不劣。
讨论 \(x_i\) 是改大了还是改小了,以此来讨论增广的是顺向的 \(S\to i\rightsquigarrow j\to S\) 还是逆向的 \(S\to j\rightsquigarrow i\to S\)。用线段树维护可以点 \(i\) 向前和向后可以达到的点,维护区间最值后线段树二分即可。
时间复杂度 \(O((n+q)\log n)\)。
ARC169
(A)
建树。显然深度最深的点会对答案产生更大的影响。由于这些点的权值最终都会传到根节点,所以可以求和看正负性。如果恰为 \(0\) 再看深度第二深的节点,以此类推。
(B)
考虑 dp。设 \(f_i\) 表示以 \(i\) 结尾的区间的总贡献。设 \(p_i=\min\left\{x\left|\sum\limits_{j=x}^ia_i\le s\right.\right\}\),则区间 \([i,i],[i-1,i],\cdots,[p_i,i]\) 的答案都为 \(1\),而左端点 \(<p_i\) 的需要进一步拆,而这个可以从 \(f_{p_i-1}\) 转移过来,即有:
答案即为 \(\sum\limits_{i=1}^nf_i\)。\(p_i\) 可以双指针求得,时间复杂度 \(O(n)\)。
(C)
题目的限制是基于一个相同数的连续段的长度,于是考虑对着连续段 dp。设 \(f_{i,j}\),表示考虑了前 \(i\) 个数,其中第 \(i\) 个数为 \(j\),并钦定 \(j\) 是其所在连续段的最后一个数。那么容易的得到转移式:
这个给 \(f\) 和 \(f_{*,x}\) 各求一个前缀和就可以优化转移。时间复杂度 \(O(n^2)\)。
D
设 \(a_i\) 最终变化为 \(b_i\)。放在 \(\bmod\ n\) 的意义下挺难思考的。考虑忽略这个 \(\bmod\ n\)。容易发现,如果将 \(a_i\) 升序排列,那么让 \(b_i\) 升序是一定不劣的。
考虑 \(b_i\) 会满足的约束:
- \(a_i\le b_i\)。因为 \(a_i\) 只会增加不会减少。
- \(b_i\) 为 \(\bmod\ n\) 的完全剩余系。因为我们一开始忽略了取模,但是取模后仍然需要满足题目条件。
- \(m\left|\sum\limits_{i=1}^n(b_i-a_i)\right.\)。每次都是恰好对 \(m\) 个数 \(+1\),总变化量当然得是 \(m\) 的倍数。
- \(\max\limits_{i=1}^n\{b_i-a_i\}\le\dfrac{\sum\limits_{i=1}^n(b_i-a_i)}m\)。一个数被增加的次数显然不会超过增加总数的平均数。
不难发现以上的条件结合起来是充要的。
首先,如果有 \(b_1+n<b_n\),那么将 \(b_1\) 变成 \(b_n-n\),将 \(b_n\) 变成 \(b_1+n\),这时的 \(b_i\) 依旧是 \(\bmod\ n\) 的完全剩余系。因此我们必然存在一个最优方案满足 \(b_i=b_{i-1}+1\)。
然后暴力枚举,找到 \(b_1\) 最小的满足前三个条件的 \(b\)。
最后需要满足第四个条件,令当前 \(b_i\) 的和为 \(s\),那么根据以上约束,答案一定形如一个 \(s+k\cdot\text{lcm}(n,m)\),其中 \(k\) 非负。
注意到对于第三个条件,随着 \(b_1\) 上升,小于等于号左边的式子增长不会比右边快。所以二分即可。时间复杂度 \(O(n+\log V)\)。
*E
显然 \(\tt B\) 个数比 \(\tt R\) 少必然无解。
不妨认为 \(\tt B,R\) 个数相同,考虑找到一个所有 \(\tt B\) 都尽量靠后的解。得到这个解后,设这个解中第 \(i\) 个 \(\tt B\) 的位置为 \(p_i\),原串第 \(i\) 个 \(\tt B\) 的位置为 \(q_i\),则答案为 \(\sum\limits_{i=1}^{2^n}\max(p_i-q_i,0)\)。位置比它靠前的一定更优,否则就要从不合法的位置调整到合法的最坏位置。
考虑构造出这个解。设 \(f(n)\) 表示长度为 \(2^n\) 的所有 \(\tt B\) 都尽量靠后的解。则有 \(f(2)\tt RB\)。对于一个 \(\tt B\),我们可以贪心地匹配后面第一个 \(\tt R\)。
求 \(f(i)\) 时,依次看 \(f(i-1)\) 的每一位,若当前这一位为 \(\tt R\),则向 \(f(i)\) 末尾添加 \(\tt R\);若为 \(\tt B\),则向末尾添加 \(\tt BR\)。最后再往 \(f(i)\) 末尾添加 \(\tt B\),直到长度达到 \(2^i\)。
容易发现贪心匹配完后每一轮对决下来,\(\tt B\) 和 \(\tt R\) 的个数都恰好占一半。事实上,\(f(i)\) 对决完的结果就是 \(f(i-1)\)。
于是就求出来了。时间复杂度 \(O(2^n)\)。
**F
考虑每个位置 \((i,j)\) 上的贡献,我们相当于要数 \((i,j)\) 右下与其连通的位置数量。考虑将每个转移的过程做连边。
如果 \((i,j)\) 和某一个位置 \((p,q)\) 不连通,那么一定存在一行或一列的不存在任何边。
如果对于第 \(k\) 行,满足 \(a_k\le\min\limits_{x=i+1}^p\{b_x\}\),那这行就不会和之前的点连通;对于第 \(k\) 列,满足 \(b_k\le\min\limits_{x=j+1}^q\{a_x\}\),那这列就不会和之前的点连通。
所以一定有 \(\min\left(\min\limits_{x=i}^p\{a_x\},\min\limits_{x=j}^q\{b_x\}\right)=\min(a_i,b_j)\)。若 \(a_i<b_j\),则对于 \(x_i\),它在 \((i,j)\) 时对 \((p,q)\) 有贡献当且仅当 \(a_i\le\min\limits_{x=j}^q\{b_x\}\le\min\limits_{x=i+1}^p\{a_x\}\)。另一种同理。
设 \(f_i\) 表示 \(\min\limits_{x=j}^q\{a_x\}\le i\) 的位置个数。这可以用单调栈处理出每个数前后第一个比它小的位置得到。
不妨钦定 \(a_i<b_j\),那么现在答案就变成了求 \(x_i\sum\limits_{p=i+1}^nf_{\min\limits_{x=i+1}^p\{a_i\}}-f_{a_i}\)。由于 \(\min\limits_{x=i+1}^p\{a_i\}\) 一定是 \(a\) 的后缀单调栈上被 \(a_i\) 弹出的数。故用单调栈维护答案即可。最后加上 \(p=i\) 的贡献。

浙公网安备 33010602011771号