4月CF杂题

Codeforces Round 862 (Div. 2)

E. There Should Be a Lot of Maximums

题意:定义一棵点有颜色的树的 MAD 为树上编号最大的出现了至少两次的颜色。对于树上每条边,求出断开它后生成的两棵树的 MAD 的最大值。n2×105,ai109

先找到整棵树的 MAD:如果 MAD 出现次数 >2,根据抽屉原理,不论怎么分答案都是 MAD;如果没有 MAD,答案都是 0;如果 MAD 出现次数 =2,发现除了 MAD 出现的两个位置路径上的边,其他边答案都是 MAD,路径上直接暴力遍历时开桶统计答案即可。时间复杂度 O(nlogn),其中瓶颈为离散化,解决问题只用 O(n)

F1. Survival of the Weakest (easy version)

题意:定义 F(a1,a2,an) 为在 a1,a2,an 中任选一对 i,j(i<j) 能得到的所有 ai+aj 的前 n-1 个最小值。求 F(F(FFn1(a1,a2,,an)))n3000,ai109。答案对 998244353 取模。

联想到 146. 序列 的做法,我们就在 O(n2logn) 的时间内解决了这个问题。那么取模呢?发现 F(F(FFn1(a1,a2,,an)))=F(F(FFn1(0,a2a1,,ana1)))+2n1a1

F2. Survival of the Weakest (hard version)

题意:同上,但是 n2×105

刚刚的做法怎么优化?直觉告诉我们一个数组中较大的一些数是没有用的。更具体地说,我们只需要保留数组中前 64 个数,这样就是 O(384n) 的(384=64×log64)。那么为什么呢?

如果 0,a1,,an 满足 a1+a2<0+an,则 an 可以删除;反之,则 F(0,a1,an)=[0+a1,0+a2,0+an]=[a1,a2,an] 等价于 [0,a2a1,ana1]F(0,a2a1,ana1)=[a2a1,a3a1,an] 等价于 [0,a3a2,an]。因为 anana2,a1+a20+an,得到 anan2,即两次操作后最后一个数要么消失要么减小至少一半,故只用保留大约 2logan64 个(因为实际操作时我们需要略多保留几个)。

好像可以只保留 44 个?没太看懂,把图片放上来吧。

Educational Codeforces Round 146 (Rated for Div. 2)

D. Balancing Weapons

题意:定义一次操作可以把 di 变成任意正整数。求最小操作次数,使得 maxi=1nfi×dimini=1nfi×dikn3000,k1500,1fi2000,1di109

首先改 n 次一定可行,只需要判断答案能否小于 n。枚举不变点 j,那么其他点 i 一定只有三种改法:改在 fj×dj 附近(上/下取整)或不变。把这些选择排个序,相当于每次选一段位置差不超过 k 的选择,求是否包含了所有点和修改的代价和。双指针维护。时间复杂度 O(n2logn),瓶颈在排序。

E. Chain Chips

很板吧。

题意:一条链每个点上有一块编号与点相同的芯片,求最小的所有芯片移动距离之和,使得所有芯片与点错拍(每个点上放一个)。支持单点修改边权。n2×105

发现使一段错拍的代价为 2 倍长度,不妨假设所有边全部会经过,问题转化为选一些不相邻的边,使得权值和最大。fi,0/1 表示选/不选 ii+1 这条边。fi,0=max(fi1,0,fi1,1),fi,1=fi1,0+2wi。写成矩阵就是 |0,02wi,|×|fi1,0fi1,1|=|fi,0fi,1|。线段树维护。

Codeforces Round 866 (Div. 2)

D. The Butcher

题意:定义一次操作是将一个矩形分割成两块,其中一块放到一旁,另一块会留在手上成为下一次操作的矩形(不会交换长宽)。现在给出 n-1 次操作后剩下的所有矩形(顺序不定),求原矩阵长宽的方案。n2×105

显然最大的长/宽一定是原始矩阵的长/宽,所以只有至多两种方案。怎么 check?每次减掉与当前长/宽相同的所有矩阵。

E. The Fox and the Complete Tree Traversal

题意:对一棵树构造一个排列 p0,1n1 满足 dist(pi,p(i+1)modn)2n2×105

手玩发现有解的充要条件是“把叶子删掉后剩下的部分是一条链”。下面证明必要性和充分性。

必要性:假设删去叶子后不是链,则存在一个点度数 3,这个点无论怎么操作都不可能让三个子树内的点形成回路。

充分性:有构造方案。找到树的直径,以端点为起点。先两步地跳,把原树分层,对于一层内的结点先让叶子加入答案,然后递归处理非叶子,在回溯的过程中把两步跳过程中略过的结点加入答案(具体见代码)。不难发现这样可以构造出一组答案。

Codeforces Round 865 (Div. 2)

D. Sum Graph

题意:交互。猜一个隐藏排列 p(知道长度 n),可以猜两次。初始图为空,至多进行 2n 两种操作:1.指定 x,把所有满足 u+v=x 的 (u,v) 连边;2.查 dist(pi,pj)n1000

因为一边查一边加边比较复杂,容易改变图的形态,考虑先加边再查询。对 x=n,x=n+1 进行两次连边可以构造出一条链。发现这样得到的图中的直径端点一定是 n2n,刚好 2+(n-1)+(n-1)=2n 次询问。

Educational Codeforces Round 147 (Rated for Div. 2)

D. Black Cells

题意:你站在一条全白的数轴上,初始位置为 0。有三种操作:1.向右移动一格;2.打开 shift 开关;3.关上 shift 开关。在 shift 开关打开期间经过的点(包括打开开关的那个点)将会在关上开关后变为黑色。给定 n 个区间,求在这 n 个区间中恰好涂黑 k 个位置的最小操作数(不可以涂黑区间之外的区域)。n2×105,k109,liri109

假设现在把前 m 个区间全部涂黑了。这样可能会多涂黑一些格子,有两种途径减少他们:1.少走几步;2.有些区间经过时不按 shift。发现除了长度为 1 的区间是方法二比较赚,其它区间选择少走一定不劣。

posted @   xx019  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示