最近做的贪心题目(2000~2600)总结
CF2085F2 Serval and Colorful Array (Hard Version)
题目大意:
有一个数 \(k\)(\(k \ge 2\))。我们称数组 \(r\) 为多彩的当且仅当:
- \(r\) 的长度为 \(k\),且
- \(1\) 到 \(k\) 之间的每个整数在 \(r\) 中恰好出现一次。
给定一个由 \(n\) 个介于 \(1\) 到 \(k\) 的整数组成的数组 \(a\)。保证 \(1\) 到 \(k\) 之间的每个整数在 \(a\) 中至少出现一次。您可以对 \(a\) 执行以下操作:
- 选择一个下标 \(i\)(\(1 \leq i < n\)),然后交换 \(a_i\) 和 \(a_{i+1}\)。
求使得 \(a\) 中至少存在一个多彩的子数组\(^{\text{∗}}\)所需的最小操作次数。
\(n \le 4 \times 10^5\)
解题思路:
这个题从某种意义上来说救了我的div1+2???
假设最终这段连续的多彩的区间中的数从左往右初始的位置位于 \(a_{1}, a_{2} \sim a_{k}\)。
那么我们发现 \(a\) 一定是递增的。
考虑假设最终的区间在 \([l, l + k - 1]\),那么我们设 \(x\) 为 \(a_{\lfloor \frac{k}{2} \rfloor}\)。
那么 \(a_{i} \le x\) 的部分会从小到大达到 \(x\),\(a_{i} > x\) 的部分会达到 \(x + 1\)。
以小于等于 \(x\) 的部分距离,他应该跑到 \(x - \lfloor \frac{k}{2} \rfloor + 1 \sim x\),但我们强行让他跑到 \(x\) 会让答案变大。
而且相当于真正的答案会少跑 \(\lfloor \frac{k}{2} \rfloor - 1 \sim 1\),右侧同理。
因为要求前面的数跑到 \(x\),后面的数跑到 \(x + 1\),那么一定是中间的最优。
所以我们不需要强定 \(x\) 了。
我们考虑枚举 \(x\)。
然后设 \(l_{i}\) 表示颜色为 \(i\) 中最后一个 \(\le x\) 的位置到 \(x\) 的距离,\(r_{i}\) 表示颜色为 \(i\) 中第一个 \(> x\) 的位置到 \(x + 1\) 的距离。
相当于求 \(\sum_{min(l_{i}, r_{i})}\)。
那么我们就有 \(O(n^2)\) 了。
然后考虑每个“相邻”的同颜色位置 \(i < j\),他们分别会在 \(x\) 在 \(i \sim j - 1\) 中选哪个。
一定是一个前缀选 \(i\),剩下的选 \(j\),那么这个差分是好维护的。
时间复杂度:\(O(n)\)。
主要的难点也是在确定一个位置来拆绝对值吧。
昨晚的 C:
CF2122C:
题目大意:
给定二维平面上的 \(n\) 个整点 \((x_i,y_i)\),保证 \(n\) 是偶数。请选出 \(\frac n2\) 组不交的点对 \((a_i,b_i)\),使得这些点对之间的曼哈顿距离之和最大。换句话说,需要最大化:
\(n \le 2 \times 10^5\) 且 \(n\) 为偶数,输出方案。
赛时思路:
考虑肯定是让 \(x,y\) 的差值尽可能大,最大的情况就是让排序后一定要前后匹配。
那么将这些点分为 4 组,由于有两个等式,相加就能发现一定有解。
\(O(n \log n)\)
CF2113D Cheater
题目大意:
你正在赌场玩一种新的纸牌游戏,规则如下:
- 游戏使用一副共 \(2n\) 张不同点数的牌。
- 牌堆被均匀分给玩家和庄家:每人获得 \(n\) 张牌。
- 在 \(n\) 轮比赛中,玩家和庄家同时打出手中最上面的一张牌。比较两张牌的点数,点数较大的一方获得 \(1\) 分。获胜的牌会被移出游戏,而失败的牌会返回持有者的手牌,并放在该玩家手牌堆的最上面。
游戏总是会进行恰好 \(n\) 轮。
你可以在游戏开始前交换手中任意两张牌的位置(最多交换一次以避免引起怀疑)。
请确定你能获得的最大分数。
\(n \le 2 \times 10^5\)
解题思路:
当我们每得一分的时候,我们就要失去一张 "大" 牌。
但是这样是无法进行下去的,因为我们既想让答案尽可能的大,又想让留下来的牌尽可能大。
面对这种要同时顾虑两种最优的时候,我们可以通过二分来优化掉其中的一个条件,将其变成判定性问题。
那么我们二分答案为 \(x\),这是显然具有单调性的。
然后由于每得一分对应出一张牌,所以我们考虑去判断前 \(x\) 张能否全部出完。
也就是说最多让庄家出 \(n - x\) 张牌,也就是不能让庄家出第 \(n - x + 1\) 张牌。
也就是我们要保证我们手里得前 \(x\) 张牌每张在庄家手里的前 \(n - x + 1\) 张牌都有一个比他小的。
而且由于题目要求,更小的那张牌是会被留在手中的。
所以我们只需要比较前 \(x\) 张的最小值和对面前 \(n - x + 1\) 中的最小值即可。
至于交换,我们可以维护前缀最小/次小值,然后维护后缀最大值,这样尝试去拿最大值去替换最小值即可。
由于可以预处理,所以 \(check\) 是 \(O(1)\) 的。
但由于 \(check\) 是 \(O(1)\) 的,所以我们可以不用二分(
\(O(n)\)
这题的难点还是在如何处理双最“优”的情况,但发现一个是具有单调性的,所以可以二分来消除。
CF2107E:
题目大意:
树有 \(n\) 个节点,根节点为 \(1\)。树的权重定义为 \(\sum \limits_{i=1}^n \sum \limits_{j=i+1}^n \text{dep}(\operatorname{lca}(i,j))\)。
树的权重大约是 \(k\),但具体的值已经丢失了。
你想造一棵有 \(n\) 个节点的苹果树,且树的权重与 \(k\) 的绝对差不超过 \(1\),即 \(|\text{权重} - k| \le 1\)。如果无法满足这一条件,请报告这一情况。
\(n \le 10^5,k \le 10^{15}\)
解题思路:
套路地,考虑将 \(\sum \limits_{i=1}^n \sum \limits_{j=i+1}^n \text{dep}(\operatorname{lca}(i,j))\) 转换问 \(\sum_{i = 1}^{n} C_{sz_{i}}^{2}\)。
那么就能确定他的范围,最小情况是菊花,最大情况是一条链。
那么我们要贪心的去构造方案。但我们发现假如选出两个一样的子树大小的话回非常麻烦,因为我们这样就必须考虑去如何将一个子树内选儿子。
而且这样可能是无解的!
所以我们钦定他除了叶子节点,其他的节点的子树大小都不相同。
这样是好构造的,因为我们可以将子树从小到大排序,然后再拿叶子节点补充。
因为 \(C_{i}^{2}\) 一定存在 \(C_{i}^{2} \le \sum_{j = 1}^{i - 1}C_{j}^{2} + 2\),所以一定能求出与 \(k\) 绝对值小于等于 1 的方案。
\(O(n)\)。
这题把我卡住的地方其实是在于出现了不可能的子树集合应该怎么办,其实可以通过改变选取方式来成功构造。
CF2106G2
题目大意:
小A购买了一棵大小为 \(n\) 的树,这棵树以某个任意节点为根。此外,每个节点的值为 \(1\) 或 \(-1\)。
小A决定和小B玩一个游戏,如果B赢了,就把这棵树送给他。
小B不知道哪个节点是根,也不知道节点的值,他只知道无根树的形态。但他可以向小A提出两种类型的查询:
1 k u₁ u₂ ... uₖ:设 \(f(u)\) 为从树的根到节点 \(u\) 的路径上所有节点的值之和。小B可以选择一个整数 \(k\)(\(1 \le k \le n\))和 \(k\) 个节点 \(u_1, u_2, ..., u_k\),然后他会收到值 \(f(u_1) + f(u_2) + ... + f(u_k)\)。2 u:小B将切换节点 \(u\) 的值。具体来说,如果 \(u\) 的值为 \(1\),则变为 \(-1\),反之亦然。
如果小B在总共 \(n + 200\) 次查询内正确猜出每个节点的值,他就获胜。你能帮助他获胜吗?
\(n \le 1000\)
解题思路:
因为正常的交互题里他的交互次数都是和 \(log\) 有关的,但是这题的询问次数达到了 \(O(n)\)。
但他要求求出每个节点的权值,所以由解 \(n\) 元一次方程组至少要 \(n\) 个方程可知,我们觉得必须把这 \(n\) 步操作留给求答案。
那么由于 \(a_{u} = f_{u} - f_{fa}\),所以我们只需在 \(200\) 步中找到根即可。
由于根可以从任意一个点跳若干次父亲然后跳到根,所以我们先尝试去找到一个点的父亲。
我们发现如果一个节点 \(x\) 改了,那么子节点 \(f\) 会正负2,父亲不会变。
那么我们就可以在 \(log\) 次询问中找到他的父亲。
具体就是二分每一个与他相连的点的前缀,然后看这些前缀的点内有没有父亲即可。
最后一步就非常套路了,由于我们要在查询完 \(log\) 个节点的父亲后找到根,所以我们可以模仿淀粉质,每次找到树的重心的父亲所在的连通块。
那么只需 \(log^2\) 步就可以了。
这题我没想到的点是最后两步,1 是没想到每个点一直跳父亲,2是没有联系到淀粉质将树分成 \(log\) 层。
CF2068A Condorcet Elections
题目大意:
共有 \(n\) 名人(编号 \(1\) 至 \(n\))参与竞选。选举采用投票制:每位选民需对所有 \(n\) 名候选人进行从最优到最差的排序。即每张选票是 \(\{1, 2, \ldots, n\}\) 的一个排列,其中排列的第一个元素代表最优先的候选人。
当且仅当候选人 \(a\) 在超过半数的选票中排在候选人 \(b\) 之前时,我们称候选人 \(a\) 击败候选人 \(b\)。
由于选举公平透明,国家电视台已提前宣布了 \(m\) 个事实——第 \(i\) 个事实为"候选人 \(a_i\) 击败候选人 \(b_i\)"。
你必须满足这 \(m\) 个条件,并输出方案,无解就输出 -1。
\(n \le 50, m \le \frac{n \times (n - 1)}{2}, 选民不能超 50000 个\)。
解题思路:
考虑只有一个限制的时候是简单的,但这题的难点在限制之间互相影响。
考虑如何在满足一个限制的时候不影响其他的限制。
由于只加一个选民是肯定不能抵消的,所以需要加两个。
然后只需要让第二个成为第一个的反转就行了。
这个题的主要的问题是在满足其中的一个条件的时候不影响其他条件。
而且这和那种多维度问题是相等的,就比如平面上先考虑 x,然后再考虑 y 可能会好做一样。

浙公网安备 33010602011771号