T1:
我们发现,答案就是每一条边的期望相加
然后就只要对每一条边单独算期望就好了
至于怎么算,那么我们可以分6种讨论:
px<=qy 全部都可以
py<=qx 全都不行
如果区间有相交,那么它的期望就是每一段的期望*长度最后/总长度
然后就是每一段期望怎么求:
然后如果一段是全部在q之前,那么就是1
如果在后面,那么就是0
然后如果在中间的就是(首+尾)/2
对于单点,期望就是后面一个能碰到的长度/总长度
详细来说见代码:
il double zhi(double x,int y) { return max((p[y]-x)/(p[y]-q[y]),0.0); } il double calc(int x,int y) { if(p[x]<=q[y]) return 1; if(p[y]<=q[x]) return 0; double lx=p[x]-q[x],ly=p[y]-q[y]; if(q[y]<=q[x]&&p[x]<=p[y]) return (zhi(q[x],y)+zhi(p[x],y))/2.0; if(q[x]<=q[y]&&p[x]<=p[y]) return ((q[y]-q[x])*1.0+(1.0+(zhi(p[x],y)))/2.0*(p[x]-q[y]))/lx; if(q[y]<=q[x]&&p[y]<=p[x]) { // printf("%lf %lf %lf ",zhi(q[x],y),zhi(p[y],y),p[y]-q[x]); return ((zhi(q[x],y)+zhi(p[y],y))/2*(p[y]-q[x]))/lx; } if(q[x]<=q[y]&&p[y]<=p[x]) return ((q[y]-q[x])*1.0+(p[y]-q[y])*0.5)/lx; }
T2:
枚举所有方法,复杂度尾组合级,没分
T3:
直接爆搜时间在l~r的联通快,20分