Codeforces Round #446 (Div 2)

本文提供了五道算法竞赛题目的解答思路及关键代码实现,包括可乐转移问题、生存人数预测、序列转换次数、唯一序列构建及最小生成树边集验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A. Greed

Description

n n n罐可乐,你被告知每罐可乐的容量和已经装了多少可乐,问是否可以通过转移可乐使得最后只剩下两罐可乐。

Solution

选出容量最大的两罐可乐判断即可。

Code

传送门


B. Wrash

Description

n n n个人,每个人可以杀死刚好在他前面的 L i L_i Li个人,问最后有多少人活下来?

Solution

当然可以用线段树过。。然而其实 O ( n ) O(n) O(n)从后往前扫一遍、每次更新能打到的最前面的人的位置就行了。

Code

传送门


C. Pride

Description

有一个序列,每次可以将一对相邻的数 x , y x,y x,y的其中一个变成 g c d ( x , y ) gcd(x,y) gcd(x,y),求使序列全部变成 1 1 1的最少操作次数,若不能,输出 − 1 -1 1

Solution

若原序列中有 1 1 1,则不断向旁边扩展即可。
若没有 1 1 1,则 O ( n 2 ) O(n^2) O(n2)找到一个最短的、 g c d gcd gcd 1 1 1的区间,再向两边扩展。

Code

传送门

D. Gluttony

Description

给你一个数字不重复、长度为 n n n的序列 { a i } \{a_i\} {ai},求构造另外一个序列 { b i } \{b_i\} {bi}满足:
对于任意序列 S = { x i } S = \{x_i\} S={xi}满足 x i ≤ n x_i\le n xin ∣ S ∣ < n |S|<n S<n,有:
∑ i = 1 ∣ S ∣ a x i ≠ ∑ i = 1 ∣ S ∣ b x i \sum_{i=1}^{|S|}a_{x_i}\not=\sum_{i=1}^{|S|}b_{x_i} i=1Saxi=i=1Sbxi

Solution

a i {a_i} ai中的数都变成序列中比它大的数中最小的那个数,最大的数变成最小的数即可。

Proof:
1.考虑若不选最大的数,则在 { a i } \{a_i\} {ai}中取到的数的和一定大于 { b i } \{b_i\} {bi}
2.若取到了最大的数,考虑比较所取的数的补集,也就是第一种情况,发现也不相等。QED!

Code

传送门
(注:比赛的时候没有看清题,以为可能有重复元素,所以有一个判重,请忽略)
比赛的时候硬刚二分匹配(被数据范围误导,然而 22 22 22的数据范围是留给spj的),刚了一个多小时。。最后10分钟才A掉。。


E. Envy

Description

给出一个联通图,给出几组询问,每次给出很多条边的编号,问这些边能否包含在同一个MST中。

Solution

看完官方Editorial后一脸懵逼,后来看了moejy0viiiiiv的代码才懂。
考虑离线处理所有询问,按边的长度从小到大的顺序处理,若已经处理了所有比该边短的边,现在要加入这条新边,则考虑如果它连接的两端不在同一个并查集中,那么这条边可以存在于MST中,否则不可以。注意要用两个数组维护并查集,一个直接更新,另一个保存上一次的状态,用于判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值