# jzoj 4540. [NOI2016 simulation 6.12] assign

Description

Input

Output

Sample Input

Example 1:
2
1 2
10 9
2
Example 2:
6
1 0 1 1 1 1
1 3 1 1 1 1
4
Example 3:
4
1 2 5 4
9 7 8 9
3

Sample Output

Example 1:
1.000000 0.000000
0.000000 1.000000
Example 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
Example 3:
0.652778 0.000000
0.347222 0.212963
0.000000 0.930556
0.000000 0.856481

Data Constraint

Hint

Analysis: for everyone (x), we think he is the last one to enter the semi-finals, and we know the score line (cnt). {l[x]<=cnt<=r[x]｝
We can know the probability of everyone entering the semi-finals.
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}
(since we are at the bottom, we can't do the same thing at the back.)
p[i]=1 i=x
We can set f[i,j] as the probability that there are j players in the second round for the first i players

`f[i,j]=f[i-1,j-1]*p[i]+f[i-1,j]*(1-p[i])`

Let g[i,j] be the last i+1 to the nth person, there is a probability of j person entering the semi-finals, the same with the transfer.

So how many chances do we have for anyone y to finish at the bottom of x?

The j-th probability that he's in the K-spot is
f[i][j] * g[i][K − j], you can add this value directly to the answer. You can judge which group you are in by the value of j%4.
But since cnt is a random number in [l[x],r[x], the probability is multiplied by 1/(r[x]-l[x]+1)

code:

```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
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;
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.```

Posted by JD-AM on Mon, 04 May 2020 06:17:56 -0700