Description
Input
Output
Sample Input
样例1:
2
1 2
10 9
2
样例2:
6
1 0 1 1 1 1
1 3 1 1 1 1
4
样例3:
4
1 2 5 4
9 7 8 9
3
Sample Output
样例1:
1.000000 0.000000
0.000000 1.000000
样例2:
1.000000 0.000000
0.000000 0.750000
0.000000 1.000000
0.750000 0.250000
0.250000 0.000000
0.000000 0.000000
样例3:
0.652778 0.000000
0.347222 0.212963
0.000000 0.930556
0.000000 0.856481
Data Constraint
Hint
分析:对于每一个人(x),我们认为他是最后一个进入复赛的,我们也就知道了分数线(cnt)。{l[x]<=cnt<=r[x]}
我们可以知道每个人进入复赛的概率。
p[i]=(r[i]-max(cnt,l[i])+1)/(r[i]-l[i]+1){i<x}
p[i]=(r[i]-max(cnt+1,l[i])+1)/(r[i]-l[i]+1){i>x}
(既然垫底,后面同分也不行)
p[i]=1 i=x
我们可以设f[i,j]为对于前i个人,有j个人进复赛的概率,有
f[i,j]=f[i-1,j-1]*p[i]+f[i-1,j]*(1-p[i])
设g[i,j]为后第i+1个到第n个人,有j个人进复赛的概率,转移同理。
那我们对于任何一个人y来说,x垫底有多少复赛的概率呢?
他排在晋级的K个人里面的第j个的概率就是
f[i][j]∗g[i][K−j],直接将这个值加到答案里面就可以了,分在哪一组,可以通过对j%4的值来判断。
不过因为cnt是[l[x],r[x]]之中随机的一个数,所以概率要乘上1/(r[x]-l[x]+1)
代码:
var le,ri:array[1..100] of longint;
f,gl,gr:array[0..30,0..30,0..3] of extended;
ans:array[1..30,0..1] of extended;
t:extended;
n,i,p:longint;
procedure calc(x,y:longint);
var i,j,k:longint;
begin
for i:=0 to n+1 do
for j:=0 to p do
for k:=0 to 3 do f[i,j,k]:=0;
f[y-1,0,0]:=1;
for i:=y-1 to n-1 do
for j:=0 to p do
for k:=0 to 3 do
if f[i,j,k]>0.1 then
begin
if ri[i+1]<x then f[i+1,j,k]:=f[i+1,j,k]+f[i,j,k]*(ri[i+1]-le[i+1]+1)
else if le[i+1]>x then f[i+1,j+1,k]:=f[i+1,j+1,k]+f[i,j,k]*(ri[i+1]-le[i+1]+1)
else
begin
if (k=2) or (k=3) then
begin
f[i+1,j,k]:=f[i+1,j,k]+f[i,j,k]*(x-le[i+1]+1);
f[i+1,j+1,k]:=f[i+1,j+1,k]+f[i,j,k]*(ri[i+1]-x);
end;
if k=1 then
begin
f[i+1,j,k]:=f[i+1,j,k]+f[i,j,k]*(x-le[i+1]);
f[i+1,j+1,k]:=f[i+1,j+1,k]+f[i,j,k]*(ri[i+1]-x+1);
f[i+1,j,2]:=f[i+1,j,2]+f[i,j,k];
end;
if k=0 then
begin
f[i+1,j,k]:=f[i+1,j,k]+f[i,j,k]*(x-le[i+1]);
f[i+1,j+1,k]:=f[i+1,j+1,k]+f[i,j,k]*(ri[i+1]-x);
f[i+1,j+1,1]:=f[i+1,j+1,1]+f[i,j,k];
f[i+1,j,3]:=f[i+1,j,3]+f[i,j,k];
end;
end;
end;
end;
procedure doit(x:longint);
var i,j,k,l:longint;
s,s1:extended;
begin
for i:=0 to n+1 do
for j:=0 to p+1 do
for k:=0 to 3 do begin gl[i,j,k]:=0;gl[i,j,k]:=0; end;
gl[0,0,0]:=1;gr[n+1,0,0]:=1;
calc(x,1);
for j:=0 to p do
for k:=0 to 3 do gr[1,j,k]:=f[n,j,k];
for i:=1 to n do
for j:=0 to p do
for k:=0 to 3 do gl[i,j,k]:=f[i,j,k];
for i:=2 to n do
begin
calc(x,i);
for j:=0 to p do
for k:=0 to 3 do gr[i,j,k]:=f[n,j,k];
end;
for i:=1 to n do
for j:=1 to p do
if ri[i]>=x then
begin
l:=ri[i]-x;if le[i]>x then l:=ri[i]-le[i]+1;
s:=gl[i-1,j-1,0]+gl[i-1,j-1,1];s:=s*l;
s:=s*(gr[i+1,p-j,0]+gr[i+1,p-j,1]+gr[i+1,p-j,2]+gr[i+1,p-j,3]);
s:=s-(gl[i-1,j-1,0]*l)*(gr[i+1,p-j,0]+gr[i+1,p-j,3]);
s1:=s;
s:=gl[i-1,j-1,2]*l;s:=s*(gr[i+1,p-j,0]+gr[i+1,p-j,3]);
s1:=s1+s;
l:=1;if le[i]>x then l:=0;
s:=gl[i-1,j-1,0]+gl[i-1,j-1,1];s:=s*l;
s:=s*(gr[i+1,p-j,0]+gr[i+1,p-j,1]+gr[i+1,p-j,2]+gr[i+1,p-j,3]);
s1:=s1+s;
l:=j mod 4;
if (l=2) or (l=3) then ans[i,1]:=ans[i,1]+s1 else ans[i,0]:=ans[i,0]+s1;
end;
end;
begin
readln(n);
for i:=1 to n do read(le[i]);
for i:=1 to n do read(ri[i]);
for i:=1 to n do begin ans[i,0]:=0;ans[i,1]:=0; end;
readln(p);
for i:=0 to 1000 do
begin
p:=p;
doit(i);
end;
t:=1;
for i:=1 to n do t:=t*(ri[i]-le[i]+1);
for i:=1 to n do
begin
ans[i,0]:=ans[i,0]/t;
ans[i,1]:=ans[i,1]/t;
end;
for i:=1 to n do writeln(ans[i,0]:0:6,' ',ans[i,1]:0:6);
end.