CodeForces 随机玩

Stop Gaming (Hard Version)

Easy Version 是只有输出答案。

考虑把矩阵拍平成序列,一个序列必然有一个前缀保留。

可以一个一个贪心匹配过去,维护一下当前匹配到了 \(a\) 序列的位置 \(j\),如果当前数 \(b_i\) 失配,并且 \(i\)\(j\) 在同一行,那么 \(j\) 需要不断减小直至 \(i,j\) 不在同一行。

构造方案同样也是直接构造,拿线段树维护一下当前可以操作的点然后操作一下就好了。


We Be Summing

其实可以直接线性。

同样考虑枚举 \(x,y\) 表示最小值和最大值,要求 \(x+y=k\)

不难发现不同的 \((x,y)\) 不会计算到同一种方案。

然后考虑枚举具体位置,也就是枚举 \(i,j\) 满足 \(a_i=x,a_j=y\)

\(l1_i/r1_i\) 表示 \(i\) 左/右边第一个比 \(i\) 小的数,\(l2_i/r2_i\)\(i\) 左/右边第一个比 \(i\) 大的数。

那么只需满足 \(l2_j<r1_i\) 就会产生贡献,这个贡献是让左端点在 \((l1_i,i]\) 右端点在 \([j,r2_j)\) 的区间变得合法。

进一步地,对于一个固定的 \(i\),会产生贡献的 \(j\) 是一个区间,容易用双指针维护。

同时根据区间的优秀性质,我们可以快速维护新增区间个数(例如前缀和)。


Nested Segments

考虑 \(m=0\) 怎么做,发现答案是有 \(n\) 个叶子的二叉树个数,是卡特兰数。

扩展到 \(m>0\) 可以考虑把区间包含关系对应的树建出来,然后每个点把儿子合并一下就好了。


Cat, Fox and Swaps

考虑能随意换的区间实际上是所有 \([l-i,r-i]\) 的并。

因此找出最靠左和最靠右的不合法点,容易得出 \(l,r\) 的限制。

需要特判 \(l=r\) 和初始有序的情况。


Caterpillar on a Tree

考虑如果 \(k=0\) 答案就是 \(2(n-1)-\text{原树最大深度}\)

对于 \(k \neq 0\) 的情况,我们将原树长链剖分,在一条长链底端跳到根可以减少一定的代价,排序之后取前 \(k+1\) 大的代价减去即可。


Brukhovich and Exams

考虑先操作能减少两个的点。

然后考虑剩下的点,发现操作一段不碰到头和尾的长度为 \(len\)\(1\) 可以减少 \(len+1\)

然后就最多只能减少 \(1\) 了,把这些数都操作一下。

最后可能还余下一段前缀和一段后缀的 \(1\),如果还多余操作就一个一个操作过去即可。


Lexichromatography

翻译一下条件二,也就是每种值的颜色都是红蓝交替的。

易知总共有 \(2^c\) 种染色方式,\(c\) 表示不同权值的个数。

进一步,我们发现 \(p>q\)\(p<q\) 的方案数是相同的,因为把一个 \(p>q\) 的方案所有颜色反转后就变成 \(p<q\) 了。

因此只需统计 \(p=q\) 的方案数即可。

从前往后考虑每个数,同时维护两个序列分别表示两种颜色,如果某个时刻两个序列相同,那么在这个时刻断开。

现在我们可以将原序列分成若干段,看上去这些段是互不影响的,每个段可以确定开头的颜色是红或蓝,设有 \(k\) 个段,答案是 \(2^k\) 吗?

但是并不是,如果某两个段的序列有交,那么一个段的颜色确定了另一个段也一定确定。

所以用并查集把它们连起来就好了,设有 \(k'\) 个连通块,答案就是 \(2^{k'}\)


Vika and Stone Skipping

考虑 \(f\) 合法的充要条件是存在一个 \(g\) 满足 \(\frac{(f+f-g+1) \times g}{2}=x\)

如果 \(g\) 是偶数,设 \(e=\frac{g}{2}\)\(k=f-e\),那么也就是 \((2k+1) \times e=x\),并且 \(k \ge e\)

如果 \(g\) 是奇数,设 \(k=\frac{g-1}{2}\)\(e=f-k\),那么也就是 \(e \times (2k+1)=x\),并且 \(k<e\)

所以合法的 \(f\) 个数就是 \(x\) 的奇因数个数,直接计算即可。


Lottery

考虑固定 \(x,c\),合法的 \(v_i\) 必然在区间 \([2c-x,x]\) 中。

因此对于一个 \(x\) 计算贡献我们只需找到它左边和右边第 \(k\) 个数便能解得合法的 \(c\) 的范围。

如果设左边第 \(k\) 个数为 \(l\),右边第 \(k\) 个数为 \(r\),可以发现,不同的 \((l,r)\) 对数只有 \(\Theta(n)\) 种,进一步,对于每种 \((l,r)\),我们只需检查最小和最大的两个 \(x\) 即可。

对于 \(l,r\) 都存在的情况,答案只与 \(x\) 的奇偶性有关,因此连续检查最小的两个数就能得到答案。

对于 \(r\) 不存在的情况,答案随着 \(x\) 的增加而减小,对于 \(l\) 不存在的情况,答案随着 \(x\) 的减小而减小,容易发现上述方式也能够覆盖这种情况。

因此我们需要检查的 \(x\) 的个数只有 \(\Theta(n)\) 个,暴力做就好了。


Count Supersequences

容易发现答案与 \(a\) 序列无关。

考虑一个 DP:\(f_{i,j}=f_{i-1,j-1}+f_{i-1,j} \times (k-1)\)

但是当 \(j=n\) 时,转移应当是:\(f_{i,j}=f_{i-1,j-1}+f_{i-1,j} \times k\)

答案就是 \(f_{m,n}\)

直接对着这个 DP 数看起来不太行,因为 \(j=n\) 时的转移是特殊的,因此可以考虑先算总方案数,然后把非法方案减掉,也就是 \(k^m-\sum_{i=1}^{n-1} f_{m,i}\)

此时 \(f_{m,i}\) 容易用组合数和快速幂求出。


DSU Master

容易发现需要递推,\(k=i+1\) 的答案应该从 \(k=i\) 的答案继承过来。

考虑 \(a_i=1\) 会怎么样,此时会把 \(i\) 的根变成 \(i+1\) 的根的儿子,此时我们发现,把操作 \(i\) 插入原来的操作序列中,\(1\) 的儿子个数是不变的,因此 \(ans \leftarrow ans \times i\)

\(a_i=0\) 呢?此时会把 \(i+1\) 变成 \(i\) 的根的儿子,一种情况是 \(i\) 的根不是 \(1\),此时 \(1\) 的儿子个数不变,一种情况是 \(i\) 的根是 \(1\),此时 \(1\) 的儿子个数加一。我们先令 \(ans \leftarrow ans \times i\),然后考虑使 \(1\) 的儿子个数加一有几种情况,此时操作 \(i\) 一定在最后加入,否则 \(i-1\) 的根一定不是 \(1\),但是即使操作 \(i\) 在最后加入,\(i-1\) 的根也未必是 \(1\)

如果要使 \(i-1\) 的根是 \(1\),前面必然不能有“把 \(j\) 的根变成 \(j+1\) 的根,并且此时 \(1 \sim j\) 是一个连通块”的操作,我们考虑令设 \(f_i\) 表示前缀 \(i\) 的所有排列不存在这样情况的方案数,如果 \(a_i=0\),那么 \(f_{i+1}=f_i \times (i+1)\)(此时所有插入方案都合法),否则 \(f_{i+1}=f_i \times i\)(不能插入到最后面)。

然后直接线性把答案算出来就好了。


Splittable Permutations

考虑建一棵二叉树,二叉树上每个节点代表一个区间,按照读入顺序考虑所有 \((l_i,r_i)\),我们容易得知当前裂开的两个区间是从哪里裂开的,按照这个关系建树即可。

接下来我们按照 DFS 序考虑二叉树的每个叶子,不难发现每个叶子都对应了原排列的一个区间,并且是按照从左往右的顺序的。

接下来考虑从大到小插入每个权值,容易计算能插入到多少个位置,因此直接计算即可。


Vertex Pairs

考虑把一个点删掉会怎么样,发现要么导致它子树内所有点被删要么导致它子树外所有点被删。

我们可以钦定一个点一定存在,把它当成根,这样删除别的点只能导致它们子树内所有点被删,同时我们发现,对于一个值 \(v\),我们设 \(L_v,R_v\)\(v\) 出现的位置,那么根到 \(\text{LCA}(L_v,R_v)\) 路径上的点都不能被删,如果 \(v\) 只出现了一次,那么根到 \(v\) 出现的点的路径上的点都不能被删。由于权值是 \(2^i\),所以从大到小贪心,每次能删则删,每次维护一下哪些点能被删即可,复杂度均摊线性。

然后我们可以枚举一下保留 \(L_1\) 还是 \(R_1\),取两种情况的较小值即可。


Bags with Balls

等价于计算:

\[\sum i^k \times \binom{n}{i} \times {\Large(\lceil} \frac{m}{2} {\Large\rceil)}^i \times {\Large(\lfloor} \frac{m}{2} {\Large\rfloor)}^{n-i} \]

显然要把 \(i^k\) 化简,变成:

\[\sum \sum_{g} \begin{Bmatrix}k\\ g\end{Bmatrix} \times i^{\underline{g}} \times \binom{n}{i} \times {\Large(\lceil} \frac{m}{2} {\Large\rceil)}^i \times {\Large(\lfloor} \frac{m}{2} {\Large\rfloor)}^{n-i} \]

化简一下:

\[\sum_{g} \begin{Bmatrix}k\\ g\end{Bmatrix} \times i^{\underline{g}} \times \binom{n}{i} \]

\[\sum_{g} \begin{Bmatrix}k\\ g\end{Bmatrix} \times n^{\underline{g}} \times \binom{n-g}{i-g} \]

交换顺序,变成:

\[\sum_{g} \begin{Bmatrix}k\\ g\end{Bmatrix} \times n^{\underline{g}} \times \sum_i \binom{n-g}{i-g} \times {\Large(\lceil} \frac{m}{2} {\Large\rceil)}^i \times {\Large(\lfloor} \frac{m}{2} {\Large\rfloor)}^{n-i} \]

配成二项式定理:

\[\sum_{g} \begin{Bmatrix}k\\ g\end{Bmatrix} \times n^{\underline{g}} \times {\Large(\lceil} \frac{m}{2} {\Large\rceil)}^g \times \sum_i \binom{n-g}{i-g} \times {\Large(\lceil} \frac{m}{2} {\Large\rceil)}^{i-g} \times {\Large(\lfloor} \frac{m}{2} {\Large\rfloor)}^{n-i} \]

\[\sum_{g} \begin{Bmatrix}k\\ g\end{Bmatrix} \times n^{\underline{g}} \times {\Large(\lceil} \frac{m}{2} {\Large\rceil)}^g \times m^{n-g} \]

直接计算即可。


Red-Blue Graph

看到这题的第一反应肯定是网络流。

将原图边拆成 \(u \rightarrow v\)\(v \rightarrow u\),分别表示红边和蓝边,如果不流则不染色。

对于左边的红点和右边的蓝点,付出的流量应当 \(>0\),由源点向这些点连限制流量为正数的边。

对于左边的蓝点和右边的红点,收到的流量应当 \(>0\),由这些点向汇点连限制流量为正数的边。

对于一个无色点,它可以收到或付出任意流量,分别向源汇点都连边即可。

建图跑最小费用可行流即可。

posted @ 2025-03-10 07:44  Tx_Lcy  阅读(25)  评论(0)    收藏  举报