Codeforces Round #600 (Div. 2)
A
给处两个序列,问是否存在一段连续的区间使得在这两个序列中元素的差值相同,存在两个及以上则输出-1。
做起来做的很丑。。打的时候写了20min才过。。太菜了。。
AC办法是前后找第一个和最后一个不同的元素位置即可,再遍历一遍left到right不断比较中间的元素是否差值都是一样就可以了。
B
写假了的模拟题。。。。System test被卡掉了。。D题也差一点点所以狂掉50分。。
和南昌热身赛最后一个图的问题在答案构造上类似,不需要最优的构造答案,只需要方便好做并且满足题目要求即可。这道题标答里的贪心办法是,办公室只要人空就进入下一天,这样子就不用再去开set云云考虑某个人今天有没有进入办公室了。
C
首先按照权值排序尽可能倒序排序显而易见。
但最开始想错了,以为是从下往上处理,不断地添加甜食堆满每天的空位。
事实上每新加一个甜食,是从第一天插入,而将后面的甜食都挤下去一位,有些甜食不会被挤到第二天,而有些会被挤到第二天从而权值加一。那么可以仅考虑第一天的变化情况,因为如果第一天的某个甜食被挤到第二天去了,那么该甜食下标减去
k
m
(
k
=
1
,
2
,
.
.
.
)
km (k = 1, 2, ...)
km(k=1,2,...)的甜食一定也会被挤下去。所以我们跨度为m的预处理每一个甜食如果被挤下去总共会多花费的代价即可。
D
因为B写的烦的一比(最后还wa了),C也写假了很久,所以最后只剩下十分钟写D。
不过看起来D题只需要用并茶几维护联通性,以最大元素作为根节点(倒序遍历节点建图即可),同时维护每一个联通块中最小的元素就可以近似
O
(
n
)
O(n)
O(n)的做出来了。
有点可惜的是当时最后有点意识模糊,在维护最小元素的时候将merge的两个元素
x
、
y
x、y
x、y的最小值做了
m
i
n
min
min,而不是将两个
r
o
o
t
root
root的最小值做了
m
i
n
min
min…
赛后改了这一行代码后惨提AC…(tmd)