GYM102500 NWERC 2019 VP 记录
写在前面
和 @zkdxl 组队 VP 了一场。
被 @zkdxl 带飞了 ,所有罚时都是我贡献的
A
题意:
有一个游戏,\(n\) 个人,初始分数都是 \(0\),\(w\) 轮,每轮有给定 \(k\) 个人分数 \(+1\)。
求每个人的排名平均值。
题解:
考虑我们可以统计以下两种贡献来的出答案。
- 其他人分数 \(+1\) 使得他排名增大
- 他分数 \(+1\) 使得他排名减小
同时 1 和 2 的贡献都会延续到最后,所以对和的贡献就是 \((w-i+1)\times v\)
2 可以直接枚举他分数变化时刻。
可以维护每时每刻有多少分数为 \(w\) 的人。
他分数增加了,排名变化量就是当前这个分数还没增加的人数。
可以直接暴力计算,复杂度 \(O(\sum w)\)。
1 可以对每个人分别计算,考虑他分数变化情况。
对于他没变化的分数段,只要在这个分数上增加了就能对他有贡献。
可以用 vector
记录分数为 \(i\) 的时候分别有哪些时刻有增加。
然后维护以下 \(\sum i\) 和 \(\sum 1\) 就可以求出贡献为 \((w+1)\sum 1-\sum i\)。
代码:
https://codeforces.com/gym/102500/submission/134162933
C
题意:
略
题解:
签到题,但是细节有一点多。
贪心地在重复地方塞夹子就行了。
代码:
https://codeforces.com/gym/102500/submission/134160067
D(补)
题意:
有 \(n\) 点 \(m\) 边的图,边权为 \(w_i\),你可以钦定 \(v(v>0),c(c\ge 0)\)。
然后把所有边的边权变成 \(\frac{w_i}{v}+c\)。
问无论怎么钦定都不可能在 \(1\) 到 \(n\) 的最短路上的边。
题解:
赛时会做了,但是午饭、午睡来不及调了。
首先设初始 \(1\) 到 \(n\) 的某条路径经过了 \(c_i\) 条边,权为 \(s_i\)。
那对于某个 \((c,v)\),它的答案是 \(\frac{s_i}{v}+cc_i=\frac{1}{v}(s_i+(cv)c_i)\)。
令 \(cv=k\),则相当于我们可以钦定 \(k(k>0)\),权是 \(s_i+kc_i\)。
然后 \(s_i+kc_i\) 可以当作一条斜率为 \(-k\) 的直线过 \((c_i,s_i)\) 的截距。
相当于我们只需要求出一个下凸壳,只有在下凸壳上的路径菜才可能在最短路上。
我们 dp 求出 \(1\) 到 \(n\) 的经过 \(k\) 的最短路权值,复杂度 \(O(nm)\)。
我他妈赛时赛后想用 dijkstra 求这个傻逼东西直接 TLE on test 22
然后求一遍下凸壳,因为 \(k>0\) 还需要抛掉后半段不降的。
然后直接记录每个点的前驱,覆盖一下就行了。
总复杂度 \(O(nm)\) 非常稳。
代码:
https://codeforces.com/gym/102500/submission/134180634
E
题意:
略
题解:
略
送分题,但是卡精,过于 ex。
代码:
https://codeforces.com/gym/102500/submission/134160344
H(嘴过,zk 切)
题意:
有一条折线,经过 \((i,h_i)\),找到两点 \(A,B\) 在折线上。
使得 \(k_{AB}\ge p\) 使得 \(|A_x-B_x|\) 最大。
题解:
首先让 \(h_i\leftarrow h_i-pi\),这样相当于求一条水平线。
肯定有一个端点在整点上,证明显然,调整即可。
然后枚举在哪个端点上,接下来肯定具有单调性。
然后维护前缀最小值、前缀最大值、后缀最小值、后缀最大值,二分一下就行了。
J
题意:
有一个序列,你可以做两种操作:
- 选择集合 \(S\),对里面每个下标,对应的权值 \(+1\) 或 \(-1\),代价为 \(A\)
- 删掉一个数,代价为 \(B\)
让序列变成正负交替,求最小代价。
题解:
枚举 1 操作用 \(k\) 次,相当于你可以改变某些数的符号。
然后操作 1 的贡献是可以通过次数求出的,剩下可以认为操作 1 不需要代价。
然后设计 dp[i][0/1]
表示到 \(i\) 是负/正的最小代价。
初始肯定有转移 dp[i][b]+c -> dp[i][b^1]
,然后每次可能会多出一些转移。
其实可以分讨,但是懒得想了,就搞了个动态 dp,直接暴力维护就做完了。