2017 Benelux Algorithm Programming Contest (BAPC 17)

地址

Rank Solved A B C D E F G H I J K L M
41/255 9/13 O . O O O O Ø . O Ø O O O

O: 当场通过

Ø: 赛后通过

.: 尚未通过

A Amsterdam Distance

solved by chelly


chelly's solution

B Bearly Made It

unsolved


C Collatz Conjecture

solved by chelly


chelly's solution

D Detour

solved by chelly


chelly's solution

E Easter Eggs

solved by chelly


chelly's solution

F Falling Apart

solved by chelly


chelly's solution

G Going Dutch

upsolved by chelly


chelly's solution

如果我们挑出一个集合,大小为n,它们的和为0,那我们最多只需要n-1次交换即可使得每个人达到平衡
于是问题就变成了,将原来的n个人分成尽可能多的集合,使得每个集合里的和都是0
考虑状压DP,最简单的想法就是枚举子集,但这样(3^n)无法接受
其实可以这样:(dp[s])表示s这个集合,最多能分成多少个和为0的子集,然后转移的时候转移到(dp[s|(1<<i)]),如果发现s的和与(1<<i)的和加起来是零,说明可以额外凑出一组为0的子集,转移的收益就是1,否则就是0

H Hoarse Horses

unsolved


I Irrational Division

solved by chelly


chelly's solution

J Jumping Choreography

upsolved by chelly


chelly's solution

(f_i)表示一个青蛙跳到离它距离为i的位置至少需要多少步
我们先考虑如何求这个(f_i),通过找规律可以发现,如果青蛙跳x步,那么它可以跳到([-frac{x(x+1)}{2},frac{x(x+1)}{2}])这段区间内与(frac{x(x+1)}{2})奇偶性相同的位置
那么对于1e6,我们就去给区间打min标记,最后统计一下就行了,于是就求出了(f_1~f_{1000000})
然后这个f大概只有1400段,于是对于每个青蛙,我们都知道离它距离1400段之内的答案,所以一次增加/删除青蛙是1400*log复杂度的,对于一次询问就相当于是单点询问
所以直接树状数组就行了

K King of the Waves

solved by chelly


chelly's solution

L Lemonade Trade

solved by ch&chelly


chelly's solution

M Manhattan Mornings

solved by chelly


chelly's solution

Dirt Replay

原文地址:https://www.cnblogs.com/Amadeus/p/9957123.html