Closed horsley closed 4 years ago
你好,这个是已知问题。
990 是一场 ICPC 赛制的比赛,我们暂时还不知道 CF 官方在 ICPC 赛制下计算 points 的规则是什么(如果你找到相关官方 Blog 欢迎分享一下),所以无从对这类比赛进行 diff 验证。而只能通过 rank 验证,应该会存在一定误差。
而对于经典赛制(按分数计算的比赛),通常 rank 和 points 是等价的,points 相等时 rank 也会相等,所以对这类比赛,用 points 或 rank 计算出来的 delta 都是一样的。
如果要忠实还原 CF 的 rating 算法,还是建议使用 points。当然其实这里是什么不重要,只要是提供一个能衡量选手赛中表现的值去 reassignRank 就可以了。
可以验证一下990那场的数据,最终结果有63个对不上,最后rating大都相差1的样子,看了下在reassign阶段也是对rank调整了1的样子。我看了四个不同版本的实现,发现有reassign这里,有两个的判断条件是point,验证数据来自 https://codeforces.com/api/contest.standings
你的版本和某个JS版本reassign时使用rank作为判断条件,另外两个使用points作为条件
参考实现1 Javascript,seed做了cache https://cfviz.netlify.com/js/calculate.js 参考实现2 Java版 官方站点上贴的实现 https://codeforces.com/contest/1/submission/13861109 参考实现3 Python版 对seed做了预计算 https://gist.github.com/cheran-senthil/7c1c63eb8caef9dcfd5815361de41b26