2025年01月随便做做

测试题目选集

依然暂无。

Miscellaneous

Atcoder AGC070B - Odd Namori

被神秘计数题击毙了。

注意到 \(G\) 为基环树森林,且特殊的贡献方式为 \(2^{\sigma(G)}\) ,其中 \(\sigma(G)\)\(G\) 中偶环个数,那么可以枚举环的集合(只有整个环才会出现在集合中),每个集合贡献为 \((-1)^x\),其中 \(x\) 是集合中的奇环个数。

然后会发现剩下一个条件就是跟树边相关的,随后发现,若最终一个环集合有贡献,那么一定会是由一条树上的祖先后代链贡献,而贡献是 \(1\),贡献是由线性代数结论推导出来的,因为原本的贡献形如:

\[\left| \begin{matrix} 1 & 1 & 1 & 1 & 1 \\ 0 & 1 & 1 & 1 & 1 \\ 1 & 0 & 1 & 1 & 1 \\ 1 & 1 & 0 & 1 & 1 \\ 1 & 1 & 1 & 0 & 1 \end{matrix} \right| = \left| \begin{matrix} 1 & 1 & 1 & 1 & 1 \\ -1 & 0 & 0 & 0 & 0 \\ 0 & -1 & 0 & 0 & 0 \\ 0 & 0 & -1 & 0 & 0 \\ 0 & 0 & 0 & -1 & 0 \end{matrix} \right| = (-1)^{n-1}\left| \begin{matrix} -1 & 0 & 0 & 0 & 0 \\ 0 & -1 & 0 & 0 & 0 \\ 0 & 0 & -1 & 0 & 0 \\ 0 & 0 & 0 & -1 & 0 \\ 1 & 1 & 1 & 1 & 1 \\ \end{matrix} \right| = (-1)^{2n-2}=1 \]

\(i\) 不能连 \(i-1\)(如果存在)时,贡献固定为 \(1\)

同时环的集合外的因为没有被要求任何条件,所以可以随便连。

时间复杂度 \(O(n)\)

Submission #61312800 - AtCoder Grand Contest 070

Atcoder AGC070C - No Streak

对于 A 胜,B 胜和平局分别表示成 \(A,B,X\),同时个数为 \(a,b,x\)。然后考虑首先解决前缀上 \(A\) 的个数始终大于等于 \(B\) 的问题。

考虑格路计数,设置一个三维的直角坐标系,\((a,b,x)\) 表示序列恰有 \(a\)\(A\)\(b\)\(B\)\(x\)\(X\) 的的终点,而每次在末尾选择一个结果则是在三维上选择一个方向走一步,要求任何时候都有 \(a\ge b\)。那么格路计数会选择在第一个 \(a<b\) 的位置之后,在之后每次选择结果之后进行 \(A\to B,B\to A,X\to X\) 的翻转。显然终点也会被翻转,所以最后用无限制时到达 \((a,b,x)\) 的方案数减去任意到达 \((b-1,a+1,x)\) 的方案数即可。

回到原题,考虑要求不出现 \(AA\)\(BB\),那么记录 \(f(a,b,x)\) 表示 \(a\)\(A\)\(b\)\(B\)\(x\)\(X\) 时,要求不出现 \(AA,BB\) 的方案数,我们会有一个大概的想法是用 \(f(a,b,x)-f(b-1,a+1,x)\) 来表示答案。但是会存在一些问题:

会发现,翻转前后对于连续出现要求的满足,实际上是几乎一致的。但是不同之处仅仅在于翻转时可能出现的:原本是 \(BB\) 而变成 \(BA\),这在 \(f(a,b,x)\) 中一定不会被统计,但却会在 \(f(b-1,a+1,x)\) 中可能会被统计若干次;原本是 \(BA\) 而被翻转成 \(BB\),这在 \(f(a,b,x)\) 中可能会被统计若干次,但在 \(f(b-1,a+1,x)\) 中却不会被统计。然后我们就希望具体求出一个 \(I\),满足 \(f(a,b,x)-I\) 就是答案。

考虑 \(I\) 中应该包含什么情况,发现,应该是在某个 \(B\) 之后第一次满足当前 \(a<b\),然后紧随其后跟着一个 \(X\) 或者一个 \(B\),并最终到达 \((b-1,a+1,x)\)。这两个情况包含翻转前 \(f(a,b,x)\) 中出现的 \(BX\)\(BA\),但翻转前的 \(BB\) 因为没有被统计,所以在 \(I\) 中也不能统计。

那么 \(I\) 就等于上述两种情况的方案数之和。

  • 考虑 \(BB\),那么可以考虑将 \(BB\) 看成是一个 \(B\),这样的方案数是完全和 \(f(b-1,a,x)\) 相等的,因为在第一个 \(a<b\) 的位置之后增减 \(B\) 显然是有操作的互逆性的,因此构成双射。

  • 考虑 \(BX\),首先可能会想到将 \(X\) 踢掉,但是如果是形如 \(BXB\) 的形式那么 \(X\) 实际上踢掉之后剩下 \(BB\) 是不会出现在 \(f(b-1,a+1,x-1)\) 中的,因此仍然需要分类讨论。

    • 如果形如 \(BXB\),那么就可以连续踢掉后面的 \(XB\),不难发现仍然合法,显然和 \(f(b-1,a,x-1)\) 中的方案构成双射。
    • 如果形如 \(BXA\) 或者 \(BXX\),那么就可以只踢掉 \(X\),所以这部分方案应该等于 \(f(b-1,a+1,x-1)\)

那么就可以得到 \(I=f(b-1,a,x)+f(b-1,a,x-1)+f(b-1,a+1,x-1)\)。那么答案就是 \(f(a,b,x)-f(b-1,a,x)-f(b-1,a,x-1)-f(b-1,a+1,x-1)\)

随后考虑 \(f(a,b,x)\) 怎么求。因为 \(a,b\) 可以交换,不妨设 \(a>0,b\ge 0\)(剩余情况是简单的)。那么枚举有多少 \(A|A\) 之间没有 \(X\),设为 \(k\),应该有 \(0\le k < a\)。那么这部分的情况是 \({a-1\choose k}\) 的。然后考虑有 \(a-k+1\) 个位置可以填 \(X\),且其中 \(a-k-1\) 个位置必须至少有一个 \(X\),那么方案数是 \({x+1\choose a-k}\) 的。最后考虑填上 \(B\),有 \(k\) 个位置必须填上 \(B\),剩余 \(a+x+1-k\) 个位置最多填上一个 \(B\),那么应该有方案数 \({a+x+1-k\choose b-k}\)。那么 \(f(a,b,x)=\sum_{k=0}^{a-1}{a-1\choose k}{x+1\choose a-k}{a+x+1-k\choose b-k}+[a=0]{x+1\choose b}\)

可以 \(O(n)\) 计算。

Submission #61316013 - AtCoder Grand Contest 070

QOJ #2065. Cyclic Distance

若一条边的一端的子树有 \(x\) 个点,另一端有 \(k-x\) 个点,那么这条边最多会被经过 \(\min(x,k-x)\) 次,而且发现显然存在一个方法能够同时满足所有边都被经过了最多的次数。那么存在一个朴素的 dp 做法,就是记 \(f(i,j)\) 表示 \(i\) 这个点的子树已经确定了 \(j\) 个点,子树内的答案最多是多少,时间复杂度 \(O(nk)\)

观察转移式形如:

  • \(f'(i,j)=\max(f(i,j),f(i,j-1))\)
  • \(f''(i,j)=f'(i,j)+\min(j,k-j)\times w_{fa_i,i}\)
  • \(f(i,j)=\max_t (f''(u,t)+f''(v,j-t))\)

显然是满足凸性的(而且题目也通过 Aliens's Trick 提示了这一点,虽然我不知道怎么使用 Alien's Trick 解决这个问题)。

考虑优化,闵可夫斯基和表示成差分形式实际上就是将差分合并之后从大到小排序,而 \(\min(j,k-j)\times w\) 实际上在差分形式下的维护也是简单的。

那么就可以对树上的 dp 值进行维护,简单的思考是通过平衡树,启发式合并做到 \(O(n\log_2^2n)\),但是仔细思考可以得到堆加启发式合并的 \(O(n\log_2^2n)\) 的做法,常数较小且比较好写。

Submission #868587 - QOJ.ac

QOJ #2070. Heavy Stones

考虑固定一个中点,怎么计算答案,实际上从直觉来说左右两个序列的合并应该是会存在一个 exchange argument 的。考虑首先一个序列上的数大于等于它后面的数,那么我们是一定会让它们连续被选的。然后考虑两段数 \(a_1,a_2,\cdots,a_n\)\(b_1,b_2,\cdots,b_m\) 的优先选择的顺序。

考虑一个数 \(a\) 如果是第 \(i\) 个被选择的,那么它对答案的贡献就是 \((n-i)a\),那么可以进行代数上的计算:

  • 先选 \(a\),则与顺序相关的贡献是 \(-\sum_{i=1}^n ia_i-\sum_{i=1}^m(n+i)b_i\)
  • 先选 \(b\),则这个贡献是 \(-\sum_{i=1}^n(m+i)a_i-\sum_{i=1}^m ib_i\)

将相同的部分减去,然后除以 \(nm\) 得到结论:先选 \(a\) 段更优当且仅当 \(\bar a<\bar b\),即平均数更小。

那么同一侧在后面且平均数更小的就直接会被合并成一段,分析得出形似凸包,那么有贡献的段的不同的平均数仅有 \(O(n)\) 个,离散化后扫描线,使用线段树维护即可。使用树状数组也可以但是会麻烦一些,不如线段树无脑。

Submission #870829 - QOJ.ac

QOJ #6355. 5

首先一个简单的考虑是将 \((k,T)\) 变为 \((k,T-k)\),就可以把 \(1\) 的作用降到更小,那么维护一个二维的答案数组 \(f(i,j)=1/0\) 表示 \((i,i+j)\) 是否可以出现,每次加入一个数做类似背包的 dp。可以发现,如果至少 \(S/5\)\(1\) 已经被加入,那么 \(f(?,j)\) 一定至多只有 \(5\) 段连续的 \(1\) 出现。而转移是简单的,考虑二进制拆分之后对于整个 \(f(?,j)\) 直接进行常数区间的合并:

\[\sum_{i=0}^s a_i\cdot i=s\\ \sum_{i=0}^s a_i=n\\ O(\max\big\{\sum_{i=0}^s \log_2 (a_i+1)\big\})=O(T) \]

那么时间复杂度是 \(O((s+n)T)\),而 \(O(T)\) 从感觉上来说像是 \(O(\sqrt n+\sqrt s)\) 但是不太会算啊,可能会带一个 \(\log\) 但是仍然是快的。

Submission #875429 - QOJ.ac

LOJ #3102. [JSOI2019] 神经网络

首先通过 dp 计算出每棵树的 \(g(T_i,j)\) 表示 \(T_i\) 被经过 \(j\) 次的方案。

考虑 \(T_2\)\(T_m\) 可以直接类似 egf 的合并,但是又有一个比较严峻的问题就是可能会出现相邻的情况,但是发现最终这些方案都是直接加起来的,所以可以容斥一下。具体来说:

\[h(i,j)=\sum_{k=j}^{s_i} (-1)^{k-j} k! {k-1\choose k-j}\cdot f(k) g(T_i,k) \\ F'(j) = \sum_{k=1}^j {j\choose k} F(k)\cdot h(i,j-k) \]

这样在计算答案的时候如果出现相邻的在一个子树里的链时的所有情况就会互相抵消。

然后就来考虑一下 \(T_1\) 的情况,就是要求第一个链来自 \(T_1\) 并且最后一个不是,处理是相似的。

时间复杂度 \(O(n^2)\)

提交记录 #2234986 - LibreOJ

Atcoder AGC060C - Large Heap

容易发现 \(U\) 是第 \(A+1\) 层的最左边的位置,\(V\) 是第 \(B+1\) 层的最右边的位置。考虑拓扑序来处理这个类似堆的排列,那么如果 \(U\)\(V\) 先弹出的概率就是 \(P[p_u<p_v]\)。那么只需要考虑 \(U-1-V\) 这条链就可以了,假设 \(1-U\) 这条链上已经弹到了位置 \(i\)\(1-V\) 这条链上已经弹到了位置 \(j\),但是 \(i,j\) 未弹出,那么下一个链上弹出的是 \(i\) 的概率就是 \(q=\frac{sz(i)}{sz(i)+sz(j)}\),而 \(j\) 的概率就是 \(1-q\)。这一点应该是显然的,因为考虑拓扑序的排列应该是后续有 \(sz(i)\)\(i\) 子树内的,\(sz(j)\)\(j\) 子树内的,那么出现这两种之一时,归属于 \(i\) 概率显然就是 \(q\)。然后就可以 dp 了。时间复杂度 \(O(n^2\log_2n)\) ,瓶颈在于处理逆元。

Submission #61731922 - AtCoder Grand Contest 060

LOJ #3936. [USACO 2023.1 Platinum] Subtree Activation

大概类似于一个构图,然后求一个经过所有点的回路的最小路程。这个可以树形 dp。

提交记录 #2254864 - LibreOJ

Luogu P9129 [USACO 2023.2 Gold] Piling Papers

对于每个左端点,考虑往右扫,\(f(l,r,o=2/1/0)\) 表示确定了数位的第 \(l\) 位到第 \(r\) 位,是否大于/等于/小于 \(X\)。发现这个 \(o\) 是可以前后合并的,然后就可以了,分别拿 \(X=B\)\(X=A-1\) 做差就可以了。

Atcoder AGC064D - Red and Blue Chips

猜测似乎顺序的决定与原本的序列的 RB 分布弱相关。将最终的 RB 序列表示成若干 B 分割了若干段 R。然后写出 \(b_1,b_2,\cdots,b_m\) 表示 R 的段数。

那么倒着思考问题,相当于是有一个序列 \(b\),加入 R 在最左侧相当于 \(b_1\leftarrow b_1+1\);随后遇到一个 \(B\) 可以把一个序列分成两个,之后这两段的最左侧都可以加入 \(R\)。那么对于一个已知的 \(b\),最优的情况就是每次在最终最大的 \(b_i\) 左侧劈。照这个思路就可以 dp 了。

Submission #61900118 - AtCoder Grand Contest 064

Atcoder AGC062B - Split and Insert

一个非典型的更换视角的 dp。

倒着考虑,那么就是每次选出若干个数提到最后。因为操作的特性,所以可以不需要考虑一次具体操作了什么,而可以只考虑一个数被操作之后的情况,会发现某一个子序列如果是值连续(下一个是上一个加一)的,那么如果其中一个被操作,那么其他的也会出现在这个操作里,不然就不优。那其实就很明朗了。记 \(f(i,l,r)\) 表示倒着扫到了 \(i\) 操作,考虑 \(l,r\) 已经在在子序列里排好序,每次往后提对于 \(l,r\) 而言,相当于就是 \(l\) 扩展(自己被提到后面)或者 \(r\) 扩展(一个 \(l'=r+1\) 的区间被提到后面)。那么就可以 \(O(n^4)\) 转移了。

Submission #61887066 - AtCoder Grand Contest 062

Atcoder ARC190C - Basic Grid Problem with Updates

神奇。钦定 \(n\le m\)

考虑 \(f(i,j)\)\(g(i,j)\) 分别表示从 \((1,1)\) 走到 \((i,j)\) 的乘积之和、从 \((i,j)\) 走到 \((n,m)\) 的乘积之和。那么对于一个列 \(l\),发现只需要知道 \(f(?,l)\)\(g(?,l+1)\) 就可以求出答案为 \(\sum_{i=1}^n f(i,l)g(i,l+1)\)。发现每次更新时,实际上是让 \(f(?,\ge l)\)\(g(?,\le l)\) 发生了变化,那么就很简单了,每次只需要挪动到新的位置上重新计算 \(f(?,l)\)\(g(?,l+1)\) 就可以了。时间复杂度 \(O(nm\min(n,m))=O(nm\sqrt {nm})\)

Submission #61909525 - AtCoder Regular Contest 190 (Div. 1)

Atcoder ARC190D - Matrix Pow Sum

\(A^p\) 等效于在邻接矩阵为 \(A\) 的图中从 \(i\)\(p\) 步走到 \(j\) 的路径乘积和。假设 \(p>2\),那么考虑如果经过了某个未定的 \(A_{i,j}\) 一共 \(k\) 次那么这个的贡献应该是:

\[\sum_{i=1}^{p-1} i^k = \sum_{i=0}^{p-2} r^{ik} \]

其中 \(r\)\(p\) 的原根。那么当 \(k\ne 0,p-1\) 时,就有:

\[\sum_{i=0}^{p-2}r^{ik}=\frac{r^{k(p-1)}-1}{r^k-1} \]

由费马小定理可得此时原式等于 \(0\)。所以一条边要么被经过 \(0\) 次,要么被经过 \(p-1\) 次贡献为 \(p-1\)。之后就很好做了,但是要特殊判断 \(p=2,3\) 的情况。

Submission #61923124 - AtCoder Regular Contest 190 (Div. 1)

Atcoder ARC190E - Gaps of 1 or 2

考虑一般图的最大匹配:

\[M = \frac 1 2 \left(|V| - \max_{S\sube V} \left(O(V-S) - |S|\right)\right) \]

其中 \(O(V-S)\) 表示挖掉 \(S\) 之后图中的奇数连通块个数。然后在区间上用矩阵乘法维护一下就可以了,时间复杂度 \(O((n+q)\log_2 n\cdot K^3)\),其中 \(K\) 是矩阵时 dp 的状态数。

Submission #61937845 - AtCoder Regular Contest 190 (Div. 1)

本文作者:saubguiu

本文链接:https://www.cnblogs.com/imcaigou/p/18650075

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   saubguiu  阅读(32)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑