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
xi≤n且
∣
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=1∑∣S∣axi=i=1∑∣S∣bxi
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中,否则不可以。注意要用两个数组维护并查集,一个直接更新,另一个保存上一次的状态,用于判断。