贪心做题记录-1
贪心做题记录-1
CF626G. Raffles
考虑在奖池中新增一个彩票新增的期望:设初始有 \(l\) 张,当前已有 \(c\) 张,获奖奖金为 \(p\),那么 \(\Delta E=\dfrac{p(c+1)}{c+1+l}-\dfrac{pc}{c+l}=\dfrac{pl}{(c+l)(c+l+1)}\)。发现对于一个奖池来说这个内容是单减的,因此可以直接贪心每次选择最大值。
接下来考虑修改的影响,以减少为例,显然选则每一张的期望都会增大,然而考虑原来的第 \(c+1\) 张新增的期望和修改后第 \(c+2\) 张新增的期望,发现两者分别为 \(\dfrac{pl}{(c+l)(c+1+l)}\) 和 \(\dfrac{p(l-1)}{(c+l)(c+1+l)}\),发现期望减少了,因为原来的第 \(c+1\) 张不优,因此现在的第 \(c+2\) 张肯定不优。对于增加同理,所以每次修改我们最多修改一张彩票的贡献。将修改位置的最后一张彩票的贡献修改正确即可,对于之前贡献的修改不难看出可以进行整体操作,根据目前选择该奖池的彩票数直接推断出目前该奖池的贡献,然后可以直接修改,复杂度是 \(O((t+q)\log n)\) 的。
因为不能选择超过原有彩票的数量较难维护,不妨考虑在超过原有彩票时将贡献直接视作 \(0\),这样不影响答案并且相对好维护一些。
CF704D. Captain America
考虑根据题目给出的信息我们可以轻松推出每行每列的某个颜色的点的个数范围,为了让总代价最小,我们考虑让拥有较小代价的点尽可能多,于是我们考虑上下界网络流,对每一行每一列一个上下界表示选择的点数的范围,然后对于每一个点连接 \(x,y\),如果这条边有流量就说明选择了这个点,于是就是跑一遍有源汇上下界最大流。
CF708E. Student's Camp
首先容易直接计算出一边被破坏了 \(x\) 个格子的概率 \(P(x)={k\choose x}p^x(1-p)^{k-x}\),因为两边互不干扰,所以某一行被破坏到 \([l,r]\) 的概率是容易算出为 \(P(l-1)P(m-r)\)。一个 naive 的想法是直接 dp,令 \(f_{i,l,r}\) 表示第 \(i\) 行被破坏到仅剩 \([l,r]\) 时前 \(i\) 行连通的概率,转移只需要找到所有 \(l'\le r,r'\ge l\) 的 \(f_{i-1,l',r'}\) 的和即可,利用二维前缀和可以做到 \(O(nm^2)\)。
我们考虑优化,更具体的,我们考虑不计算所有符合转移条件的位置的概率和,而是计算所有位置的概率和减去不符合转移条件的位置的概率和,即
于是我们可以考虑迅速维护中间的三个和式,分别记为 \(F(i-1),L(i-1,l),R(i-1,r)\)。我们关注到,\(F(i)\) 即为前 \(i\) 行连通的概率,因此只需要求出 \(F(n)\) 即可,并且 \(L,R\) 的形式高度对称,也就是说我们有 \(L(i,x)=R(i,m+1-x)\),所以我们下文只关注 \(L\) 的求法。
可以考虑维护一个 \(S(i,x)\) 表示所有右端点为 \(x\) 的位置的概率和,那么我们有 \(L(i,l)=\sum_{x<l}S(i,x)\),并且,我们发现 \(F(i)\) 就是所有 \(S\) 的和,于是我们只需要能够快速求出 \(S\) 就可以推出所有内容,考虑直接将 \(f\) 的转移式代入,我们有:
于是我们可以在 \(O(nm)\) 的复杂度内求得所有内容。
CF538H. Summer Dichotomy
考虑构造 \(n_1=\min_{1\le i\le n}r_i,n_2=\max_{1\le i\le n}l_i\),对于这样的构造分类讨论:
- 存在一个 \([l_i,r_i]\) 满足 \(n_1<l_i\le r_i<n_2\),此时显然无解。
- 所有 \([l_i,r_i]\) 两两有交,此时显然所有老师可以任意选择。
- 否则因为不存在无法选择的老师,则此时每位老师至少可以选择其中一个。
问题在于无法保证 \(t\le n_1+n_2\le T\)。考虑一个贪心的想法:\(n_1\) 变大必然导致一个老师无法选择,\(n_2\) 变小必然导致一个老师无法选择,因此 \(n_1\) 只会减小,\(n_2\) 只会变大。也就是在 \(n_1+n_2>T\) 时调整 \(n_1\),\(n_1+n_2<t\) 时调整 \(n_2\) 即可。于是我们得到了一组可能的可行解,接着跑一遍二分图染色检查即可,复杂度是 \(O(n+m)\) 的。
CF573E. Bear and Bowling
有一个贪心:每一次我们考虑所有未选择的数对答案的贡献,选择最大的那一个,然后不断更新其他剩余数的贡献,直到答案无法增加为止,最后得到的就是答案。通过实践发现这个贪心是对的,并且这个贪心的正确性是可以保证的。
考虑每个数的贡献都形如 \(ka_i+b\) 的形式,其中 \(k\) 是前面已经选择的数的个数加 \(1\),\(b\) 是后面所有数的和。那么选择一个数的影响就是对前面所有数的 \(b\) 增加 \(a_p\),后面所有数的 \(k\) 增加 \(1\)。
Solution1
可以直接使用 KTT 维护从而做到超小常数 \(O(n\log^3n)\)。
Solution2
也可以考虑用分块维护。更具体的,为了找到每个块内 \(ka_i+b\) 最大的数,对于每一个块,我们维护每一个块统一的 \(k,b\) 和单独的 \(f_i\),那么每个数的贡献就是 \(ka_i+b+f_i\),然后可以维护一个上凸包去求解,对于新选择的数所在的块暴力重构。这样每次查询在块内二分可以做到 \(O(n\sqrt{n}\log n)\)。但是考虑到每个块在重构之前的 \(k\) 单调不降,因此二分的斜率具有单调性,也就是说我们可以用单调队列将复杂度优化至 \(O(n\sqrt{n})\)。
事实上 KTT 跑得是比分块快得多的。
CF1495E. Qingshan and Daniel
考虑到最先出完所有牌的一定是牌总数较少的那一组,我们将这一组记为 \(A\),剩下的那一组记为 \(B\),然后将所有连续且在同一组的记作同一段,那么最后一定形如 \(ABAB\cdots AB\) 或 \(BABA\cdots BA\),对于第二种情况,找到第一次操作与其匹配的 \(A\),统计第一个 \(B\) 的贡献从后这个位置开始即可,不难证明对答案不产生影响。
考虑对于 \(A\) 的答案显然已知,只需要考虑 \(B\) 的答案,不难发现每一个 \(A\) 在后面都一定对应一个 \(B\) 的回应,不妨暴力扫两遍序列,同时维护有多少个 \(A\) 没有和 \(B\) 匹配,那么每遇到一个 \(A\),只需要将对应的牌数加入即可。而遇到 \(B\) 时考虑尽可能多的匹配即可,这样复杂度是 \(O(n)\) 的。
CF526G. Spiders Evil Plan
因为路径是可重的,所以 \(k\) 条路径显然可以得出一棵 \(2k\) 个叶子的树,考虑这些叶子都是原树上的叶子肯定更优。我们先忽略包含 \(x\) 的条件,则这个内容是套路的:首先考虑到一定存在一个最优方案使得选择了直径的其中一个端点,于是可以以两个端点均为根跑一次答案。因为直径的端点一定是叶子,那么我们就是要选除根外的 \(2k-1\) 个叶子,接下来分类讨论:
- 当原树叶子结点个数比所需的叶子还要小,答案就是所有边的权值和。
- 否则对原树进行带权长链剖分,然后按照所在链的边权和从大到小选择。容易证明这样次选出来的点一定和根节点连通。
考虑加入包含 \(x\) 的条件,那么无非是两种情况:
- 删去贡献最小的叶子并加入 \(x\) 所在的链。注意为了保证连通要加入这条链上方的所有未选择的边。
- 删去 \(x\) 所在链上方最近的一条被选择的链的后半段,然后加入 \(x\) 所在链上方的所有边。
虽然我们无法保证 \(2\) 操作得出的答案是连通的,但可以证明不连通时得到的答案一定不如 \(1\)。于是可以直接求解。注意到这道题进行的是带权重链剖分,因此不能直接跳链求解上面的内容,需要使用倍增,复杂度是 \(O(m\log n)\) 的。
CF1693E. Outermost Maximums
考虑肯定贪心的将每个位置覆盖成前缀最大值和后缀最大值中更小的那个,因为肯定优先处理比自己大的和外层的最大值,所以需要忽略值比自己大的值和相同的值的贡献,这样可以做到 \(O(n^2)\)。
考虑给每一个位置一个标记,分为取前缀最大值、未确定和取后缀最大值。当我们枚举到一个值的时候,将所有位置初始化成未确定。接下来当枚举到一个更小的值的时候,如果一个未确定的标记在其最右位置的右侧,则肯定取后缀最大值更好,在其最左位置的左侧也同理取前缀最大值。而在最左位置右侧的前缀最大值标记因为相当于确定取到该值,将该位置视为当前值一同处理即可,对于在最右位置左侧的后缀最大值标记同理。
分析可以发现任何时刻一定一个前缀的标记为取前缀最大值,一个后缀的标记为取后缀最大值,中间的一段为未确定,于是可以维护这三个标记的分界线。对于每一个值,维护当前有多少个位置最终会取到这个值,将所有和累加即为答案。计 \([l,r]\) 为取未确定标记的位置的范围,那么根据当前值的出现的极小区间 \([L,R]\) 和其的位置关系分类讨论即可。用数组结构维护区间已操作位置的个数,复杂度是 \(O(n\log n)\)。
CF1827E. Bus Routes
有一个显然的充要条件:原问题有解当且仅当存在一个点使得每个点到这个点都能通过至多一条路径到达。考虑如何找出这个点。
首先我们发现我们只需要判断叶子结点,因为叶子结点能够一步到达,则其到根路径上的所有点都能一步到达。我们先随意取一个点为根,记 \(\text{faz}(l)\) 为 \(l\) 通过一步路径能到达的深度最浅的点。考虑如果存在两个点的 \(\text{faz}\) 不为祖先关系,那么显然无解,构造就是这两个叶子结点。否则我们选取深度最深的 \(\text{faz}\),以这个点为根再求一次 \(\text{faz}\),如果存在点的 \(\text{faz}\) 不为根,则显然无解,构造即为这个点和之前的 \(\text{faz}\) 为根节点的点,否则肯定有解。
证明是容易的:对于第一个无解证明显然,因为这两个叶子之间至少还要一条路径才能连通;对于有解也显然,因为我们找到了符合要求的点;对于第二个无解,考虑如果根就是叶子结点,那么说明没有和这个叶子相连的路径,构造显然符合;否则根不是叶子,那么考虑在原来的树上,子树内肯定存在一个叶子与一条不超过根所在子树的路径相连,那么其他点如果不能一步到达根,则一定不能通过两条路径直接到达,则构造合法。
于是我们通过求 LCA 即可快速求出 \(\text{faz}\),复杂度是 \(O(n\log n)\) 的。
CF1817E. Half-sum
考虑我们肯定是排序后选择一些前缀合成最小值,后缀合成最大值。并且通过手玩可以发现从后往前合并最小值,从前往后合并最大值,于是我们有一个 \(O(n^2)\) 的做法:对于每一个分界点我们维护一个高精度二进制数,对于每个二进制数求出来后暴力判断大小即可。考虑优化,我们先写出分界点为 \(p\) 时的贡献总和:
对这个东西进行差分,考虑分界线从 \(p\) 变成 \(p+1\) 的贡献变化,有
接着对这个东西拓展一下,考虑将分界线从 \(p\) 移到 \(q\) 的贡献(\(p<q\)),于是我们有
假设 \(p<q\le\dfrac{n}{2}\),那么和式的内容一定是负的,考虑此时只需要 \(\dfrac{\delta_p}{2^p}\ge\dfrac{\delta_q}{2^{n-q}}\) 就能保证 \(p\) 比 \(q\) 优。首先我们排除 \(\delta_p=0\) 的情况。考虑到 \(q\le\dfrac{n}{2}\),于是 \(n-q\ge\dfrac{n}{2}\),又因为 \(\delta\) 的值域上限为 \(10^9\),所以只需要 \(p\le \dfrac{n}{2}-30\) 就可以保证 \(p\) 比 \(q\) 优。也就是说如果在 \([1,\dfrac{n}{2}-30]\) 中存在 \(\delta_p\ne 0\),则这个位置肯定最优。否则我们无法判断 \((\dfrac{n}{2}-30,\dfrac{n}{2}]\) 中最优的那一个,但因为此时区间长度并不大,直接暴力即可。对于 \(\dfrac{n}{2}<p<q\) 同理,于是最多查询 \(O(\log V)\) 个区间,则复杂度为 \(O(n\log V)\)。
CF1292E. Rin and The Unknown Flower
首先我们显然可以花费 \(2\) 的代价知道所有位置上的字母具体是什么,考虑沿用相同的思路,只是将字符串的长度略微调大。
更具体的,我们通过询问 CC
,CH
,CO
可以知道所有 C
的位置(最后一位除外),接着可以考虑询问 HO
和 OO
,这样可以知道所有 O
的位置(第一位除外)。那么也就是说此时在 \([2,n-1]\) 上未确定的位置一定是 H
,于是我们最多不确定的位置就只有第一位和最后一位。如果第一位不确定,那么只可能是 H
或 O
,而最后一位只可能是 C
或 H
,于是我们最多有 \(4\) 种情况,询问 \(3\) 次后即可确定答案。则此时的总花费为 \(\dfrac{5}{2^2}+\dfrac{3}{n^2}\),很可惜只能通过 \(n>4\) 的情况。
考虑对于 \(n=4\) 的情况单独讨论,同样先询问 cc
,CH
,CO
,HO
,如果这里面有的内容出现过,很显然最多只有两个位置不确定,并且除了最后一位,其他位置只可能是 H
,O
中的一个,而最后一个位置可能是 C
,H
,O
中的一个,因此最多有 \(6\) 种情况,询问 \(5\) 次后即可确定答案,则此时的总花费为 \(\dfrac{4}{2^2}+\dfrac{5}{n^2}\),可以通过。否则询问 OO
,若出现过,则一定是出现了一个前缀的 O
,否则一定存在一个 O
前面的位置无法填写,考虑如果第三位不确定,则其一定是 H
,而最后一位是 C
或 H
,于是我们最多有 \(2\) 种情况,询问 \(1\) 次即可,总花费为 \(\dfrac{5}{2^2}+\dfrac{1}{n^2}\)。最后如果上述询问均为出现,那么中间两位一定是 HH
,考虑查询 HHH
。这样如果第一位仍旧不确定则为 O
,否则为 H
,最后一个不确定则为 C
,否则为 H
。于是我们一定可以确定整个串,代价为 \(\dfrac{5}{2^2}+\dfrac{1}{3^2}\)。可以通过。