GYM102500 NWERC 2019 VP 记录

写在前面

和 @zkdxl 组队 VP 了一场。
被 @zkdxl 带飞了 ,所有罚时都是我贡献的

A

题意:
有一个游戏,\(n\) 个人,初始分数都是 \(0\)\(w\) 轮,每轮有给定 \(k\) 个人分数 \(+1\)
求每个人的排名平均值。
题解:
考虑我们可以统计以下两种贡献来的出答案。

  1. 其他人分数 \(+1\) 使得他排名增大
  2. 他分数 \(+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

题意:
有一个序列,你可以做两种操作:

  1. 选择集合 \(S\),对里面每个下标,对应的权值 \(+1\)\(-1\),代价为 \(A\)
  2. 删掉一个数,代价为 \(B\)

让序列变成正负交替,求最小代价。
题解:
枚举 1 操作用 \(k\) 次,相当于你可以改变某些数的符号。
然后操作 1 的贡献是可以通过次数求出的,剩下可以认为操作 1 不需要代价。
然后设计 dp[i][0/1] 表示到 \(i\) 是负/正的最小代价。
初始肯定有转移 dp[i][b]+c -> dp[i][b^1],然后每次可能会多出一些转移。
其实可以分讨,但是懒得想了,就搞了个动态 dp,直接暴力维护就做完了。

原文地址:https://www.cnblogs.com/pealfrog/p/15503784.html