比赛-Round 1 (14, Jul, 2018)
Posted ghcred
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了比赛-Round 1 (14, Jul, 2018)相关的知识,希望对你有一定的参考价值。
1. 同行
以 1, 2, N 为源点跑分别跑最短路,假设边权为 1 。用 dis[1][N]*B+dis[2][N]*E 和 dis[1][i]*B+dis[2][i]*E+dis[N][i]*P (满足 1 <= i <= N) 来更新答案即可。
2. 长跑
设 f[i][j] 表示到达的第 j 个点是第 i 号点,答案是 f[N][N-K] .
f[1][1] = 1
f[i][j] = min{ f[t][j-1] + cost(t, i) }
时间复杂度 O(n3) ,略大,但是注意到 j 是有限制的,即 j+N-i >= N-K ,在动规的循环里加入这个限制,加个计数器会发现最多会跑大概 6 千万次,可以过。
不过据说纯暴力 5003 也可以过。
3. 糖果
考虑先给每个小朋友发足够的糖果,然后收回。可以发现,应尽量“平摊”地收回糖果。这点很重要。即每次考虑对每个有糖的小朋友都收回 1 颗糖果,直到收回所有超额发出的糖果即可。当然这个收的过程肯定不能每次暴力扫暴力 -1 ,应该先对小朋友糖果数排序,然后从小到大讨论……
正确性由柯西不等式可以证明。
4. 抗议
注意到分的组数没有意义,所以可以定一维的动规 f[i] 表示前 i 头牛的分组方案数。
f[0] = 1
f[i] = Σf[j] (j < i 且 sum[i]-sum[j] >= 0)
对 sum 离散化之后可以用树状数组维护,省去枚举 j 。即先 f[i] = GetSum(hs[i]) 然后再 Add(hs[i], f[i]) 。答案是 f[n] 。
我改悔罢!
一开始想出了 4 题暴力动规,优化暂时没想出来。发现 1 题看起来很水,所以赶紧写了一波出去透气。然后非常弱智地写了单向边,存反图。图论题居然连边是有向还是无向都不仔细看,唉……然后写了 2 题正解,用了 20 分钟证明 O(n3) 的暴力是可行的。之后慢慢搞出了 4 题树状数组优化。最后一个小时用手列数据+数学证明的方式,在强力样例的帮助下调试了半个小时,写对了。
好好看题!
以上是关于比赛-Round 1 (14, Jul, 2018)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Global Round 14 (A~E)