Codeforces Round #446 (Div 2)

来源:互联网 发布:vb进度条控件使用 编辑:程序博客网 时间:2024/06/05 19:33

A. Greed

Description

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

Solution

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

Code

传送门


B. Wrash

Description

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

Solution

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

Code

传送门


C. Pride

Description

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

Solution

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

Code

传送门


至此,我用20分钟A掉了前3道题,然后。。。

D. Gluttony

Description

给你一个数字不重复、长度为n的序列{ai},求构造另外一个序列{bi}满足:
对于任意序列{Si}满足Sin|S|<n,有:

i=1|S|axi=i=1|S|bxi

Solution

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

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

Code

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


D. Envy

Description

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

Solution

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

Code

待填坑。。(然而我似乎从不填坑)


后话

啥?涨了158!!!哈哈哈!!!我1728终于上蓝啦!!!

原创粉丝点击