省选贪心专题做题记录

省选贪心专题做题记录

A CF626G Raffles

\(\text{Link}\)

先考虑没有修改怎么做。考虑增加一张彩票对于答案的贡献,画图分析可知,\(\dfrac{x}{x+c}\) 单调递增,且增长速度越来越慢。也就是说我们单次做出的贡献会不断变小,所以我们可以使用贪心,用堆维护往每一个堆上加一张彩票的贡献,每次取最大的即可。

然后考虑修改,我们修改 \(l_i\) 之后显然会改变某些堆上的 \(t_i\) 值以达到最优解,所以再用一个堆维护每一个堆删除一张彩票的贡献,然后不断挪动彩票直到无法变得更优。不难想到的是,由于 \(l\) 每次只会变化 \(1\),所以彩票的变化量应该是 \(O(1)\) 级别的。事实上每次最多只会变化一张,所以暴力做复杂度就是正确的。

用两个 multiset 维护两个堆即可,复杂度 \(O((t+q)\log n)\)

B CF704D Captain America

\(\text{Link}\)

首先考虑转化限制。假设一条线上有 \(cnt\) 个点,要求两种颜色差的绝对值 \(\le d\),那么对于任意一种颜色,其能取到的上下界是 \(\left[\lceil\frac{cnt-d}2\rceil,\lfloor\frac{cnt+d}2\rfloor\right]\)

那么此时就可以考虑利用网络流来求解这个问题了。不妨设 \(r\le b\),我们先钦定所有点都涂蓝,然后我们跑最大流,求出最多能换出多少个红点,显然这样最优。连边也是比较套路的,对于每一个 \((x,y)\),连边 \((x,y,[0,1])\),然后与源汇点相连的边的流量限制就是上面推出的上下界。然后跑一遍有源汇上下界最大流即可。

输出方案可以看残量网络上边的剩余流量来判断,无解的判定和上下界网络流本身的判定一致。

C CF708E Student's Camp

\(\text{Link}\)

首先发现每一行的消除是独立的,每一行左右两端的消除还是独立的,于是我们可以先计算出一段消掉 \(x\) 个格子的概率 \(p_x\)。这个概率是容易算出的,有:

\[p_x=\binom{k}{x}p^x(1-p)^{k-x} \]

然后考虑 dp,最直接的想法就是设 \(dp(i,l,r)\) 表示第 \(i\) 行留下的区间为 \([l,r]\) 的合法概率,显然有转移方程:

\[dp(i,l,r)=p_{l-1} p_{m-r}\times \sum_{[l',r']\cap[l,r]\neq\varnothing} dp(i-1,l',r') \]

直接转移复杂度 \(O(nm^4)\)。如果用一下二维前缀和可以做到 \(O(nm^2)\),不过还是过不了。

问题的关键显然在于我们的状态太多,考虑能不能优化一下。我们把后面的和式容斥一下,变成总方案减去 \(r'< l\) 以及 \(l'>r\) 的方案就是最后的答案。我们发现这始终只和一个端点有关,那么不妨在状态中只保留一个;又因为网格是对称的,所以区间右端点在 \(i\) 处的概率之和就是左端点在 \(m-i+1\) 的概率之和。

那么我们就可以把状态改成 \(f(i,r)\) 表示第 \(i\) 行留下区间右端点为 \(r\) 的概率。那么枚举左端点,可以得到转移方程:

\[f(i,r)=\sum_{l=1}^r p_{l-1}p_{m-r}\left(\sum_{x=1}^rf(i-1,x)-\sum_{x=1}^{l-1}f(i-1,x)-\sum_{x=1}^{m-r}f(i-1,x) \right) \]

显然用一下前缀和优化,令 \(g(i,j)=\sum\limits_{x=1}^j f(i,x)\),则有:

\[\begin{aligned} f(i,r)&=\sum_{l=1}^r p_{l-1}p_{m-r}\left(g(i-1,r)-g(i-1,l-1)-g(i-1,m-r) \right)\\ &=p_{m-r}\left(\sum_{l=1}^r p_{l-1}\times (g(i-1,r)-g(i-1,m-r))-\sum_{l=1}^r p_{l-1}\times g(i-1,l-1) \right) \end{aligned} \]

然后再维护一下 \(p\) 的前缀和以及 \(p\times g\) 的前缀和即可做到 \(O(1)\) 转移,复杂度就是 \(O(nm)\) 了,可以通过。

D CF538H Summer Dichotomy

\(\text{Link}\)

首先我们先对限制关系跑一个二分图染色判定,如果不行肯定无解。

然后我们考虑给左右两边分的人数 \(n_1,n_2\),我们先考虑一个比较宽松的限制。取 \(n_1=\min\{r_i\},n_2=\max\{l_i\}\) 是一个不错的限制,因为只有这样才至少能保证所有区间都能取到。接下来满足 \(n_1+n_2\in [t,T]\) 的限制,容易发现,我们此时只能减少 \(n_1\) 或增大 \(n_2\),所以调整即可。

然后根据 \(n_1,n_2\) 将区间再次划分,跑一遍二分图染色判定即可。复杂度是 \(O(n+m)\) 的,可以通过。

E CF573E Bear and Bowling

\(\text{Link}\)

考虑一个贪心策略:我们考虑单次加入一个数的贡献,不难发现贡献可以写成 \(ka_i+b\) 的形式,其中 \(k\) 表示当前在 \(i\) 之前已经被选中的数的个数,\(b\) 表示在 \(i\) 之后已经被选中的数的和。

那么我们每次贪心选最大的,然后操作就是后缀的 \(k\) 加一,前缀的 \(b\)\(a_i\)。这就是 KTT 的板子了,直接套上即可。

F CF1495E Qingshan and Daniel

\(\text{Link}\)

考虑最后一定有一组机器人打完牌,不妨设其为阵营 \(1\)。此时会发现,阵营 \(1\) 的牌一定会被出完,那么实际上我们只需要考虑阵营 \(2\) 的出牌情况即可。

题目中要求 \(1,2\) 交替出牌,但是实际上我们可以进行一些转化。显然,每一个 \(1\) 出牌后面一定对应一个 \(2\) 出牌,那么我们可以改变出牌顺序,这样答案是不变的。对于每一个 \(1\),找出它后面第一个 \(2\),然后给答案加上对应贡献即可。实现的时候可以直接扫两遍整个环,记录当前阵营 \(1\) 出的牌数,然后遇到阵营 \(2\) 再出牌即可。复杂度是 \(O(n)\) 的。

G CF526G Spiders Evil Plan

\(\text{Link}\)

首先我们选的链一定是叶子到叶子的路径,所以我们总共需要选 \(2y\) 个叶子。这里有一个结论:\(p\) 条路径可以覆盖一个有 \(2p\) 个叶子的树。那么我们每次固定 \(x\) 为根(假设 \(x\) 度数不为 \(1\)),选出 \(2y\) 个叶子,求出包含这些叶子以及根的最小连通块的权值最大值即可。这个问题是一个长链剖分的经典题目,对整棵树做长链剖分,求出前 \(2y\) 大的链之和就是答案。这样的话我们就有一个 \(O(n^2)\) 的做法。

然后考虑怎样不换根求出答案。需要再发现一个性质是,经过 \(x\) 的最长链一定经过直径端点,所以答案选出的路径也一定经过直径端点。分别以两个直径端点为根求长链剖分,此时根节点度数为 \(1\),所以我们只需要选 \(2y-1\) 个叶子,也就是选出 \(2y-1\) 条链即可。但是此时这些链不一定经过 \(x\),所以要进行调整。调整的方法有两种:

  • 删去最小的一条链,把 \(x\) 接到连通块内。
  • 找出 \(x\) 上面第一个被覆盖的点,把这个点下面的一段扔掉,加入 \(x\) 的路径。

那么我们此时需要求出 \(x\) 上面第一个被覆盖的点,倍增求即可。这样我们就可以在单次 \(O(\log n)\) 回答询问。总复杂度是 \(O((n+q)\log n)\),可以通过。

H CF1693E Outermost Maximums

\(\text{Link}\)

首先考虑贪心策略:我们每次考虑当前数列中的最大值,记 \(l_i\) 表示第 \(i\) 个数左侧小于该数的最大值,\(r_i\) 类似的表示右侧。那么对于一个最大值 \(v_i\),更改后的值应该是 \(\min(l_i,r_i)\)。而这个值是一定能取到的,因为 \(l_i\le r_i\) 的部分显然是一个前缀,所以对这个前缀做 \(1\) 操作,剩下的部分做 \(2\) 操作即可。

然后这个题最大的难点是如何快速维护这个信息。首先 \(O(n^2)\) 暴力枚举的做法是显然的,不过这样做肯定过不去。所以我们对于每一个位置去考虑它能变成什么值是没有前途的,考虑换一种统计贡献的方法。我们从大往小枚举值域,考虑有哪些数会变成它。

假设我们当前枚举到 \(x\),显然只有比 \(x\) 大的数才会修改。记 \([l,r]\) 为最小的包含所有 \(x\) 的区间,那么此时所有在这个区间内的,比 \(x\) 大的数一定会被修改为 \(x\)。而与此同时,对于该区间两边比 \(x\) 大的数,我们不希望让它们取到 \(x\),所以它们会分别向左 / 向右去取值。于是所有比 \(x\) 大的值可以被分为三种类型:? 表示不确定向左或向右取最大值,< 表示向左取最大值,> 表示向右取最大值。

那么在修改一个区间 \([l,r]\) 时,首先将区间内部所有比 \(x\) 大的值改为 \(x\),类型全部改为 ?。然后将 \(r\) 右侧所有 < 以及 \(l\) 左侧所有 > 的值也改为 \(x\),并将类型改为 ?。然后容易发现一个性质是,? 所在的一定是一段区间,< 一定是一段前缀,> 一定是一段后缀。所以我们维护 ? 构成的极大区间,这样 \(r\) 右侧所有 < 以及 \(l\) 左侧所有 > 也是一段连续区间。用树状数组维护每个位置的值即可,复杂度 \(O(n\log n)\)

I CF1827E Bus Routes

\(\text{Link}\)

首先直接做不好做,我们找一些有用的充要条件。首先容易发现的是我们只需要关注叶子节点之间能否互相到达,因为叶子之间的限制是更强的。然后考虑两个叶子何时一定不合法,不难发现,如果我们令 \(anc(x)\) 表示 \(x\) 一步能走到的深度最浅的点,那么若存在两个点 \(x,y\) 使得 \(anc(x)\)\(anc(y)\) 不是祖孙关系,则 \(x,y\) 一定不合法。

但是这个条件只是不合法的充分条件,并不是充要条件,所以我们需要加以补充。此时我们所有的 \(anc(x)\) 应该分布在一条根链上,那么我们只需要取出 \(anc(x)\) 中深度最小的点,以它为根重新求一遍 \(anc'(x)\)。此时所有叶子节点都应该能一步走到根节点,否则不能满足题目条件;而如果可以的话,容易发现任意两个叶子节点之间一定可以在两步之内走到,所以这个条件就是充要的。

求解 \(anc(x)\) 是比较简单的,在此不再赘述。时间复杂度是 \(O(n\log n)\)

J CF1817E Half-Sum

\(\text{Link}\)

首先先考虑贪心求解。我们一定是将所有数分成两个部分,分别求出最大值和最小值做差,设求出最小值的集合为 \(A\),求出最大值的集合为 \(B\)。则有一个显然的结论:\(A\) 中的任意一个数不大于 \(B\) 中的数。可以用调整法证明。

然后我们考虑对于一个给定集合 \(A\),要使得最后得到的数最小,需要怎样进行操作。这里还有一个结论是:我们从大到小依次求出平均数即可。证明也很简单,假设有四个数 \(a,b,c,d(a<b<c<d)\),先分别合并 \(a,b\)\(c,d\) 求出的数字是 \(\dfrac{a+b+c+d}4\);而从大到小依次求平均数得出的数字是 \(\dfrac{a}2+\dfrac{b}4+\dfrac{c+d}{8}\)。而 \(2a<c+d\),所以后者更小。对于求出最大值也是同理的,我们从小到大依次求出平均数即可。

那么我们就可以先对 \(a\) 排序,然后 \(A,B\) 一定存在一个分界点。枚举 \(A\) 中最后一个元素的位置 \(i\),将系数拆开后可知此时答案是:

\[ans_i=\sum_{i+1<j\le n} \frac{a_j}{2^{n-j+1}}+\frac{a_{i+1}}{2^{n-i-1}}-\sum_{1\le j<i}\frac{a_j}{2^j}-\frac{a_i}{2^{i-1}} \]

不过此时我们是难以直接计算的,因为我们要求对 \(10^9+7\) 取模,这样无法判断大小。而采用高精度复杂度是 \(O(n^2)\) 的,太劣。

此时考虑做差分,求出 \(ans_i-ans_{i-1}\)

\[ans_i-ans_{i-1}=\dfrac{a_{i+1}-a_i}{2^{n-i}}+\dfrac{a_{i-1}-a_i}{2^i} \]

不过这个东西显然没有任何单调性,所以没办法直接贪心。那么考虑一段区间的变化量。令 \(b_i=a_{i+1}-a_i\),那么有:

\[ans_r-ans_l=\sum_{i=l+1}^{r} b_i\times\left(\dfrac{1}{2^{n-i}}-\dfrac{1}{2^i}\right)+\frac{b_r}{2^{n-r}}-\frac{b_l}{2^l} \]

发现和式中 \(\dfrac{1}{2^{n-i}}-\dfrac{1}{2^i}\) 的正负取决于 \(l,r\)\(\dfrac{n}{2}\) 的相对关系。那么不妨以 \(\dfrac{n}{2}\) 为调整起点,看向左向右怎样调整可以更优。

  • \(l<r\le\dfrac{n}{2}\) 时,我们希望 \(ans_l> ans_r\),也就是上面式子的值为负数。此时前面的和式一定是负的,所以只需要考虑后面的式子即可,也就是 \(\dfrac{b_r}{2^{n-r}}-\dfrac{b_l}{2^l}<0\)。那么容易发现,在 \(b_l>0\) 的时候,只要满足 \(l\le n-r-\log V\) 就一定可以满足要求。

    也就是说,只要 \(l\le n-\dfrac{n}{2}-\log V=\dfrac{n}{2}-\log V\),那么 \(l\) 越往左走越优。所以找到第一个满足 \(b_l>0\)\(l\le \dfrac{n}{2}-\log V\)\(l\) 计算答案即可;如果没有这样的 \(l\),再检查 \(\left[\dfrac{n}{2}-\log V,\dfrac{n}{2}\right]\) 中的数即可。

    实现的时候为了方便起见,可以检查前 \(\log V\)\(b_l>0\)\(l\),这样两种情况均可讨论到。

  • \(\dfrac{n}{2}\le l<r\) 时同理。我们只需要检查后 \(\log V\)\(b_r>0\)\(r\) 即可。

这样的话我们只需要检查 \(O(\log V)\) 个位置的值,单次检查的复杂度是 \(O(n\log V)\) 的,所以总复杂度 \(O(n\log^2 V)\),可以通过。

K CF1292E Rin and The UnKnown Flower

\(\text{Link}\)

首先有一个代价为 \(2\) 的显然做法,问一遍 CH 即可。这个做法并不是完全没有参考价值,因为它提醒我们在有 \(k\) 个备用选项时只需要问 \(k-1\) 次即可确定答案。这在下文还会运用。

现在考虑扩大我们的串长来满足代价限制。我们会发现,我们可以通过问 CHCOCC 来确定除了最后一个 C 以外所有的 C 的位置,总代价只有 \(\dfrac 34\)。 此时我们发现所有的 C 将序列分成了若干段,并且除了第一段以外每一段的开头我们是知道的。

先不考虑第一段和最后一个位置,此时剩下的部分一定只有 HO,而我们又知道每一段的开头字符,所以实际上我们只需要询问出 HO 交界的地方即可求出答案。那么分别询问 HOOH 即可。然后此时第一段可以取 HO 中的一个,最后一个位置可以取原值或 C。总共有 \(4\) 种可能,我们问 \(3\) 次即可,每次串长都是 \(n\) 的。

综上我们得出了一个 \(\dfrac 54+\dfrac{3}{n^2}\) 的做法。很不巧的是,当 \(n=4\) 时这个值是 \(1.4375\),恰好比要求的代价多一点点。而 \(n>4\) 的时候这个做法是可以通过的。所以接下来我们需要特殊讨论 \(n=4\)

依然先询问 CHCOCC,如果存在至少一个字符串,那么剩下的位置最多两个。并且至少一个位置是不能填 C 的,所以总情况最多 \(6\) 种,问 \(5\) 次即可。代价为 \(\dfrac34 +\dfrac 5{16}=1.0625\)

如果都没有出现继续问 OH,然后仿照上面的过程继续问,代价为 \(1+\dfrac{5}{16}=1.3125\)

至此我们的过程和 \(n>4\) 是一致的,但是如果接下来问 HO 的话我们的做法就和上面完全一样了。考虑到此时前三位上不可能有 C,且 O 一定在 H 之后,所以前三位的情况只有 HHHHHOHOOOOO,总共 \(4\) 种,问 \(3\) 次即可。然后每一种情况的最后一位都只有两种可能,再问一次即可。总代价为 \(1+\dfrac{3}{9}+\dfrac{1}{16}\approx 1.396\),卡的非常紧,不过足够通过。

posted @ 2025-06-15 20:53  UKE_Automation  阅读(45)  评论(0)    收藏  举报