Loading

随笔

按位或

or 的作用就是将某些位置推平成 \(1\),那么我们用 \(E(\min(S)),E(\max(S))\) 分别表示位集合 \(S\) 中第一个和最后一个变成 \(1\) 的期望时间。那么答案就是 \(E(\max(U))\),这样转化的优点在于,可以使用 \(\min-\max\) 容斥来优化:

\[E(\max(U))=\sum_{S\ne \varnothing} (-1)^{|S|+1} E(\min(S)) \\ \]

考虑 \(E(\min(S))\),只要选择的数中与 \(S\) 有交即可,而每一次选择的数与 \(S\) 有交的概率为 \(\sum\limits_{T\cap S\ne \varnothing} p_T\),于是得到:

\[E(\min(S))=\frac{1}{\sum\limits_{T\cap S\ne \varnothing} p_T}=\frac{1}{1-\sum\limits_{T\subseteq (U\setminus S)} p_T} \]

\(p\) 做高位前缀和,然后直接计算即可。时间复杂度 \(O(n2^n)\)

重返现世

比较板。我们有扩展 \(\min-\max\) 容斥:

\[\mathrm{kthmax}(S)=\sum_{T\subseteq S} (-1)^{|T|-k}\binom{|T|-1}{k-1}\cdot \min(T) \]

进一步地可以扩展到期望。我们令 \(k\leftarrow n-k+1\),那么此题就是要求 \(E(\mathrm{kthmax}(S))\),直接套用,相当于要求出:

\[\sum_T (-1)^{|T|-k}\binom{|T|-1}{k-1}E(\min(T)) \]

与上题相同,考虑 \(E(\min(T))\),每秒有 \(\frac{\sum\limits_{x\in T}p_x}{m}\) 的概率选中,那么期望就是 \(E(\min(T))=\frac{m}{\sum\limits_{x\in T}p_x}\)。那么考虑按住 \(\sum\limits_{x\in T}p_x=sum\),然后统计出容斥系数的和,乘上对应的贡献 \(\frac{m}{sum}\)

难点在于如何统计容斥系数。考虑令 \(f_{i,j}\) 表示考虑 \(p_{1\sim i}\)\(\sum\limits_{x\in T} p_x=j\)\(T\) 的容斥系数之和,即求

\[\sum\sum_T (-1)^{|T|-k}\binom{|T|-1}{k-1} E(\min(T)) \]

但是我们发现这样似乎比较难转移,因为中间的组合数在加入数之后会发生变化,而就现在的状态设计难以转移,考虑再增添一维,我们将 \(k\) 也变成变量放在状态里,状态变成 \(f_{i,j,k}\)。考虑转移:

不选 \(p_i\)。显然有 \(f_{i,j,k}\leftarrow f_{i-1,j,k}\)。选 \(p_i\)。考虑容斥系数的变化:

\[(-1)^{|T|-k+1}\binom{|T|}{k-1}=(-1)^{|T|-k+1}\left[\binom{|T|-1}{k-1}+\binom{|T|-1}{k-2}\right] \]

考虑后面那两坨在干嘛,第一坨显然就是 \(-f_{i-1,j-p_i,k}\),后面那项经过整理可以发现就是 \(f_{i-1,j-p_i,k-1}\),于是得到转移:\(f_{i,j,k}\leftarrow f_{i-1,j-p_i,k-1}-f_{i-1,j-p_i,k}\)

\[f_{i,j,k}\leftarrow f_{i-1,j,k}+f_{i-1,j-p_i,k-1}-f_{i-1,j-p_i,k} \]

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

[AGC058B] Adjacent Chmax

做过总是不会。可以看做是每个数可以左右拓展进行染色,记 \(p_i\) 可以染色的区间是 \([L,R]\),那么限制就是最后序列中 \(p_i\) 出现的位置一定是被 \([L,R]\) 包含的一段连续区间,我们发现这个限制是充要的。于是直接对这个结构 \(\mathrm{dp}\)

\(f_i\) 表示 \([1,i]\) 在最终序列的染色方案数。考虑 \(p_i\) 对方案数的影响,对于 \(L\le x\le R\)\(p_i\) 可以染所有 \([L,x]\) 为起始点区间,因此对 \(f_x\) 的影响就是 \(f_x\leftarrow \sum\limits_{i=L-1}^{x-1} f_i\),因此我们直接从 \(L\)\(R\) 递推 \(f_x\leftarrow f_{x-1}\) 即可。

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

[AGC054B] Greedy Division

转变计数对象。核心思想就是将排列与某种限制构成双射,这样对满足限制的结构计数即可。注意到,如果我们确定了两人分别选择的序号,那么可以确定且唯一确定一个满足的排列。进一步的,只需要对第一个人选择的序号集合 \(S\) 计数即可,这种情况下的方案数就是 \(|S|!\times (n-|S|)!\)\(S\) 的计数就是一个简单的背包。

[ARC224D] Angst for All Pairs

先尝试刻画一下“存在卡片包含 \(x\)\(y\) 中恰好一个”,考虑用集合 \(S_x\) 表示 \(x\) 出现的卡片编号集合,如果不满足条件,相当于每个卡片要么不包含 \(x,y\),要么都包含,即 \(S_x=S_y\)。那么我们就用 \(S\) 将原来的问题转化为:

求对 \(1\sim K\) 分配集合 \(S_x\subseteq\set{1,2,\dots,N}\),使得任意两个集合不相同,最小化 \(\sum\limits_{i=1}^K \mathrm{digits}(i)\cdot |S_i|\)

这个问题就很简单了,直接按照 \(i\) 从小到大,贪心地按集合大小从小到大分配集合,即按照 \(|S_i|=0,1,\dots,N\) 分配,其中 \(|S_i|=k\)\(\binom{|S_i|}{k}\) 个。

并且从这里可以窥见,如果 \(K>2^N\),集合个数不够,那么无解。

最酷的排列

又饭堂了。先简化问题,将 \([l,r]\) 排序其实就是对相邻两个数排序,也就是我们可以将小的数和大的数 \(\mathrm{swap}\) 一下扔到前面去。

然后就是贪心了,极值法考虑答案的下界是什么,\(i\) 位置的数只能由 \([i,n]\) 中换过来,从后往前扫,用小根堆维护备选数,遇到酷的位置就取出堆顶,这样一定不劣取到了下界,并且显然是可以构造出方案的。

CF1437F Emotional Fishermen

抓住核心结构,对其进行计数。我们考虑找到所有 \(x\ge 2y\) 的位置为 \(b_1,b_2,\dots,b_k\),换言之,我们找到所有的前缀最大值的位置,其满足 \(b_p\ge 2b_{p-1}\)。不难发现序列可以被刻画为:

\[\boxed{b_1}\underbrace{\dots\dots}_{\le\dfrac{b_1}{2}}\boxed{b_2}\underbrace{\dots\dots}_{\le\dfrac{b_2}{2}}\dots\dots\boxed{b_k}\underbrace{\dots\dots}_{\le\dfrac{b_k}{2}} \]

考虑如何对这个结构计数,我们只关心 \(b\) 这些关键位置,其余位置用组合数直接计算。对 \(a\) 升序排序后,令 \(f_i\) 表示目前确定了 \(b_1,b_2,\dots,b_k\) 的位置,并且 \(b_k=a_i\) 的方案数。

转移考虑枚举 \(b_{k-1}=a_j\),此处需要满足 \(2a_j\le a_i\),用 \(lim_i\) 表示最大的 \(j\) 使得 \(2a_j\le a_i\)。考虑 \(b_k\) 管辖的那一部分数有多少种填写方案,在前面已经分配好的情况下,\(b_k\) 一定会填在第一个未填的位置,否则一定不合法,那么总共有 \(lim_i-lim_j-1\) 个数,要放到剩下的 \(n-lim_j-2\) 个空位里,就是 \(A_{n-lim_j-2}^{lim_i-lim_j-1}\) 种方案,因此得到转移:

\[f_i=\sum_{j=0}^{lim_i}f_j\cdot A_{n-lim_j-2}^{lim_i-lim_j-1} \]

直接转移时间按复杂度 \(O(n^2)\),注意到这个东西可以拆,就是 \(O(n)\) 的。

ARC225B Independent Nim

差点没想出来。把 \(1\) 的连续段拎出来,首先这些段之间就不是独立的,因此不考虑 \(\mathrm{SG}\)

从小的开始考虑。只有一个 \(len=2\) 是必败局面。考虑两个 \(len=2\),如果先手拿成 \((1,2)\),那么我可以再拿掉 \(1\) 变成必败,如果先手拿成 \((1,1)\),我可以两个都拿走。进一步地,可以发现只有 \(len=2\) 的情况下先手必败,因为先手拿掉的 \(1\) 都可以被后手再次推成 \(0\)

然后我们声称,先手必败当且仅当只有 \(len=2\),并且只需要先手进行一次操作就可以做到,分类讨论:

  • \(len=1\),直接拿走。若 \(len=2\),不管。

  • \(len\ge 3\),我们发现一定可以将这一段拆分成若干个 \(2\)

对每一段进行这个操作即可。

ARC225C K Spanning Tree

考虑 \(K\) 合法的必要条件,记 \(X,Y\) 分别表示最小生成树和最大生成树的权值,那么要有 \(X\le K\le Y\),并且我们声称满足这个条件的 \(K\) 都可以被构造出来。

考虑找出所有 \(0\) 边构成的连通分量,就是把原图中的所有 \(1\) 边删掉后分裂出的连通块,他们之间仅通过 \(1\) 边相连。我们按以下过程构造:

  • 先保证各个连通块之间连通,也就是最小生成树中选择的边,会恰好选择 \(x\) 条边,将各个连通块之间连通,这样就保证了生成树的连通性。

  • 再加入恰好 \(K-x\) 条边,枚举所有 \(1\) 边,在不构成环的情况下加入边,由Kruskal的过程,这是可行的,并且由于 \(K\le y\),这一步是可以做到的。

  • 然后枚举 \(0\) 边加入,使生成树连通。

ARC225D Gap Swap (easy)

考虑定义 \(f(P)=\sum\limits_{i=1}^n |P_i-i|\) 表示 \(P\) 的“错位代价”。此时,\(P\) 排好序等价于 \(f(P)=0\)

关键观察:交换 \(P_i,P_j\) 时,由于 \(k\in (i,j)\) 已经全部满足 \(P_k=k\),所以 \((i,j)\) 的所有值已经被占据,\(P_i,P_j\) 只能取 \(\le i\) 或者 \(\ge j\) 的数。然后我们考虑交换 \(P_i,P_j\)\(f(P)\) 造成的影响。

贡献:\(|P_i-j|+|P_j-i|-|P_i-i|-|P_j-j|\)。经过分类讨论,我们发现对 \(f(P)\) 的贡献是 \(0,+2(j-i),-2(j-i)\),也就是说,每次操作最多可以使 \(f(P)\) 减少 \(2(j-i)\),而一次操作代价为 \((j-i)\),所以平均每单位代价最多可以使 \(f(P)\) 减少 \(2\)。因此,答案的下界就是 \(\frac{1}{2}f(P)\)

下面我们证明答案的下界是可以取到的。减少贡献的情况是 \(P_i\ge j,P_j\le i\),就是两个数都朝着各自的方向走。我们证明,在非有序的情况下,一定能找到这样的对。记所有 \(P_k\ne k\) 的位置为 \(k_1,k_2,\dots,k_m\),容易发现一定有 \(P_{k_1}>k_1,P_{k_m}<k_m\),令位置差 \(d_k=P_k-k\),也就是有 \(d_{k_1}(+),d_{k_m}(-)\),不可能平白无故从 \(+\) 变成 \(-\),因此中间一定存在 \(i\),使得 \(d_{k_{i}}(+),d_{k_{i+1}}(-)\),这两个数中间的数已经归位,因此可以交换。证毕。

因此答案就是 \(\frac{1}{2}f(P)\)

CF2229E Deconstruction Tree

发现这个过程在树上非常混乱邪恶,于是我们规避树上的具体删除步骤,只关注最终的序列 \(S\)。可以发现 \(S\) 一定以初始时最大的叶子 \(st\) 开头,并一定以 \(n\) 结尾,后者启发我们将 \(n\) 定为根。并且有关键观察:已经被删掉的点的编号,一定都小于当前选择的点的编号。

考虑直接用 \(f_i\) 表示 \(S\) 的结尾为 \(i\) 时的方案数。由于 \(i\) 要被删除,\(i\) 的子树中的点都要提前被删掉,考虑 \(i\) 上一个被选中的点是 \(j\),最后用 \(j\) 消掉了 \(i\),因此有 \(j<i\)。我们令 \(i\) 子树中除 \(i\) 以外的最大值为 \(sub_i\),因为 \(j\) 最终可以将 \(i\) 子树消空,所以必然要有 \(j>sub_i\)。因此可以得到转移:\(f_i=\sum\limits_{j=sub_i+1}^{i-1} f_j\)

最后 \(f_n\) 的转移要特殊处理,考虑最终 \(n\) 被消掉的形态,不难发现一定是 \(n\) 有一个子树 \(k\) 没有消空,而其他的子树全部被消掉,此时 \(n\) 裸露出来变成叶子,被 \(k\) 中的某个点 \(x\) 消掉。根据观察,此时消掉的 \(x\) 其编号严格大于 \(n\) 除了 \(k\) 以外的所有子树的编号最大值。因此直接枚举子树统计即可。

时间复杂度是 \(O(n)\) 的。

posted @ 2026-05-04 11:47  STDJCY  阅读(12)  评论(0)    收藏  举报