专业网站建设公司用织梦吗?北京做seo的公司
2021牛客OI赛前集训营-提高组(第四场)
题目大意
有nnn个选手参加比赛,比赛有两道题。
对于第一题,第iii个选手有50%50\%50%的可能拿到ai,1a_{i,1}ai,1分,有50%50\%50%的可能拿到000分。
对于第二题,第iii个选手有50%50\%50%的可能拿到ai,2a_{i,2}ai,2分,有50%50\%50%的可能拿到000分。
一名选手的排名为分数比他高的选手的个数加1。求每个选手的期望排名。
题解
每个选手总共可能有4种成绩,每种成绩都为14\dfrac 1441的概率。
先只考虑选手aaa的一种成绩对选手bbb的一种成绩的贡献。如果选手aaa的一种成绩大于选手bbb的一种成绩,那么在这种情况下aaa对bbb排名的贡献为1,而出现这种情况的概率为116\dfrac{1}{16}161,所以这种情况对bbb的期望排名的贡献为116\dfrac{1}{16}161。
我们可以把每种选手的各种成绩放在一起排序。选手iii的期望排名就是,对于选手iii的各个成绩,在这个成绩之前的不是选手iii的成绩的成绩的数量之和乘116\dfrac{1}{16}161,最后再加1。
因为aaa的值比较小,所以可以用桶来维护。
时间复杂度为O(n+k)O(n+k)O(n+k),其中kkk为桶的大小。
code
#include<bits/stdc++.h>
using namespace std;
int n,ans,a[100005][2],z[200005];
double pt;
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d",&a[i][0],&a[i][1]);++z[0];++z[a[i][0]];++z[a[i][1]];++z[a[i][0]+a[i][1]];}for(int i=20000;i>=0;i--){z[i]+=z[i+1];}for(int i=1;i<=n;i++){ans=z[1]+z[a[i][0]+1]+z[a[i][1]+1]+z[a[i][0]+a[i][1]+1];if(a[i][0]!=0) --ans;if(a[i][1]!=0) --ans;if(a[i][0]+a[i][1]!=0) --ans;if(a[i][1]!=a[i][0]) --ans;if(a[i][0]+a[i][1]!=a[i][0]) --ans;if(a[i][0]+a[i][1]!=a[i][1]) --ans;pt=1.0*ans/16+1;printf("%.6f\n",pt);}return 0;
}