codeforces 303E
来源:互联网 发布:淘宝开店要交钱吗 编辑:程序博客网 时间:2024/06/03 21:05
将坐标离散化(下文提到的坐标和区间都是离散化后的值),然后对于第i个人的区间L~R的R-L个小区间x~x+1计算答案,dp[k][x1][x2]表示前k个人(去掉第i个人)有x1个人区间小于当前区间,x2个人在当前区间的概率,然后用dp[n][x1][x2]计算一下对i的每个排名的贡献就行了
复杂度
code:
#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#include<string>#include<vector>#include<cstdio>#include<cstdlib>#include<cstring>#include<climits>#include<complex>#include<iostream>#include<algorithm>#define ll long longusing namespace std;const int maxn = 210;const double eps = 1e-9;int n;int lsh[maxn*2],ln,K;map<int,int>mt;int To[maxn];int li[maxn],ri[maxn];double f[2][maxn][maxn];double ans[maxn][maxn];int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&li[i],&ri[i]),lsh[++ln]=li[i],lsh[++ln]=ri[i]; sort(lsh+1,lsh+ln+1); lsh[0]=lsh[1]-1; K=0; for(int i=1;i<=ln;i++) if(lsh[i]!=lsh[i-1]) To[mt[lsh[i]]=++K]=lsh[i]; for(int i=1;i<=n;i++) li[i]=mt[li[i]],ri[i]=mt[ri[i]]; for(int i=1;i<=n;i++) { for(int x=li[i];x<ri[i];x++) { double inow=(double)(To[x+1]-To[x])/(To[ri[i]]-To[li[i]]); for(int x1=0;x1<=n;x1++) for(int x2=0;x2<=n;x2++) f[0][x1][x2]=f[1][x1][x2]=0; int now=1; f[now][0][0]=1.0; for(int j=1;j<=n;j++) { if(i==j) continue; int L=To[li[j]],R=To[ri[j]]; now=!now; if(x<li[j]) { for(int x1=0;x1<j;x1++) for(int x2=0;x2<j-x1;x2++) if(f[!now][x1][x2]>eps) { double tmp=f[!now][x1][x2]; f[!now][x1][x2]=0; f[now][x1][x2]+=tmp; } } else if(ri[j]<=x) { for(int x1=0;x1<j;x1++) for(int x2=0;x2<j-x1;x2++) if(f[!now][x1][x2]>eps) { double tmp=f[!now][x1][x2]; f[!now][x1][x2]=0; f[now][x1+1][x2]+=tmp; } } else { double p1=(double)(To[x]-L)/(R-L),p2=(double)(To[x+1]-To[x])/(R-L),p3=(double)(R-To[x+1])/(R-L); for(int x1=0;x1<j;x1++) for(int x2=0;x2<j-x1;x2++) if(f[!now][x1][x2]>eps) { double tmp=f[!now][x1][x2]; f[!now][x1][x2]=0; f[now][x1+1][x2]+=tmp*p1; f[now][x1][x2+1]+=tmp*p2; f[now][x1][x2]+=tmp*p3; } } } for(int x1=0;x1<n;x1++) for(int x2=0;x2<n-x1;x2++) if(f[now][x1][x2]>eps) { double tmp=f[now][x1][x2],temp=1.0/(x2+1.0); for(int l=0;l<=x2;l++) ans[i][x1+l+1]+=inow*tmp*temp; } } } for(int i=1;i<=n;i++) { for(int j=1;j<n;j++) printf("%.10lf ",ans[i][j]); printf("%.10lf\n",ans[i][n]); } return 0;}
阅读全文
0 0
- codeforces 303E
- codeforces 163E e-Government
- 【Codeforces 163E】E-Government
- Codeforces 78E Evacuation
- 【dp】codeforces 83E
- Codeforces 124 E
- Codeforces 231E
- Codeforces 231E - Cactus
- Codeforces #163 Div2 E
- codeForces 35E
- Codeforces 35E
- Playlist codeforces 268E
- Codeforces 148E(Porcelain)
- codeforces round#177 E
- codeforces 203E Transportation
- CodeForces 254 E Dormitory
- codeforces日记371e
- Codeforces #81E Pairs
- 面向对象
- 砝码称重
- 初识Cookie
- 【SDK驱动开发1】中断的使用(以一个dma为例)
- 【福分系统】js有时无法接收controller传回的结果?
- codeforces 303E
- Tyvj1208(LIS数量)
- 深入理解JavaScript系列
- C#219课的主要内容
- 第三周 求集合并集
- sql 20170922
- 一道关于对象传参的面试题
- Python内存管理机制
- iOS_侧滑开启和关闭