Codeforces Rating 的计算方法与理解
评分方法
Codeforces 大体的评分思路是根据你的评分,得到一个你期望的排名然后再根据你的实际排名与期望排名之间的差距更改你的 Rating。
需要得到期望排名就需要先求出 \(x,y\) 两个人之间的胜率,具体的设 \(P_{x,y}\) 表示 \(x\) 战胜 \(y\) 的概率。具体的假设两人 Rating 分别为 \(r_{x}\) 与 \(r_{y}\),则:
那么就容易得到你的排名期望为:
注意这里的 \(seed\) 是一个实数。
在比赛结束后,得到第 \(i\) 个人的排名 \(rank_i\)。
接下来假设在比赛开始之前存在一个人 \(z\),满足:
那么我们定义第 \(i\) 个选手表现分为第 \(z\) 个人开始前的 Rating,设为 \(R_i\),于是我们取 \(d_i=\dfrac{R_i-r_i}{2}\) 作为该选手 Rating 的变化量。
我们还需要进行一些微调,因为如果所有选手的平均分数随着时间的变化而大幅度改变,那么 Rating 就会出现所谓的“通货膨胀”或者“过度增值”。
通过一下面的方式得到 \(inc\):
让所有用户的评分的变化量都增加 \(inc\),让总和的变化量接近 \(0\) 且小于 \(0\)。
接下来进行第二次微调,取一个属于 \([-10,0]\) 的值,尽可能使前 \(\min(n,4\sqrt{n})\) 的人分数变化量为 \(0\)。
一些理解
容易发现 CF 的评分和 AT 的评分不一样,CF 的 Rating 改变只与一场比赛的排名和开始前的 Rating 有关,所以不需要为上一把打的好而担心下一把掉分。
其次对于 Rating 的改变,CF 先取了一次几何平均,最后增加的也只是期望 Rating 的一半,所以并不是必须每一把打的上一把好才能上分。
有些 CF 罕见的中国时间场里面有一大堆大佬报名其实也不用担心掉分,因为如果 Rating 低期望的排名也就相应的低。
而因为大佬的评分都比较高,所以这样 \(seed_z\) 也就会比普通的场次高出一些,是不会影响你上分的。