(由于是实数范围,端点足够小,因此区间都使用中括号,且符号取等号)

定义$P(X)$表示$\forall 2\le i\le n,a_{i}-a_{i-1}\ge X$的概率,那么我们所求的也就是$P(X)$的积分

考虑如何求某一个$P(X)$($X$为非负实数):

令$a'_{i}=a_{i}-iX$,那么也就是要求$\forall 2\le i\le n,a'_{i-1}\le a'_{i}$,之后$a'_{i}$随机区间为$[x_{i-1}-iX,x_{i}-iX]$

将所有端点排序并后,依次为$p_{1}\le p_{2}\le ...\le p_{2n}$,那么这个问题也就是离散的了,再记$[l_{i},r_{i}]$为$a'_{i}$所对应的区间,则可以通过如下dp来计算:

$f_{i,j}$表示仅考虑$a'_{1},a'_{2},...,a'_{i}$,满足$a'_{1}\le a'_{2}\le ...\le a'_{i}\le p_{j}$的概率,转移枚举$k$满足$a_{k-1}\le p_{i-1}\le a_{k}$,之后从$f_{k-1,j-1}$转移过来,下面考虑转移系数:

若不满足$\forall k\le t\le i,[p_{j-1},p_{j}]\subseteq [l_{t},r_{t}]$则为0,否则即$\frac{\prod_{k\le t\le i}\frac{p_{j}-p_{j-1}}{r_{t}-l_{t}}}{(i-k+1)!}$,通过倒序枚举$k$可以方便维护

综上,就可以$o(n^{3})$求出$P(X)$

如果$p_{i}$的相对顺序不变,那么结果即一个关于$X$的多项式,同样可以dp求出

又因为只有$(2n)^{2}$个交点,因此只有$o(n^{2})$种顺序,对于确定的顺序后解出$X$的范围并求积分即可

另外dp状态中需要存储一个$n$次多项式,因此时间复杂度是$o(n^{6})$

还有由于最后答案是对998244353取模,需要用分数的形式存储交点以及比较

  1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 25
4 #define M 1000005
5 #define mod 998244353
6 int n,ans,x[N],inv[M];
7 struct frac{
8 int x,y;
9 bool operator < (const frac k)const{
10 return x*k.y<k.x*y;
11 }
12 frac operator + (const frac k)const{
13 return frac{x*k.y+k.x*y,y*k.y};
14 }
15 frac operator - ()const{
16 return frac{-x,y};
17 }
18 frac operator * (const frac k)const{
19 return frac{x*k.x,y*k.y};
20 }
21 int get_val(){
22 return 1LL*x*inv[y]%mod;
23 }
24 }l[N],r[N];
25 vector<frac>v;
26 struct poly{
27 int n,a[N];
28 bool operator < (const poly k)const{
29 return n<k.n;
30 }
31 poly operator + (const poly k)const{
32 poly o;
33 o.n=max(n,k.n);
34 for(int i=0;i<=min(n,k.n);i++)o.a[i]=(a[i]+k.a[i])%mod;
35 for(int i=k.n+1;i<=n;i++)o.a[i]=a[i];
36 for(int i=n+1;i<=k.n;i++)o.a[i]=k.a[i];
37 return o;
38 }
39 poly operator - ()const{
40 poly o;
41 o.n=n;
42 for(int i=0;i<=n;i++)o.a[i]=mod-a[i];
43 return o;
44 }
45 poly operator * (int k)const{
46 poly o;
47 o.n=n;
48 for(int i=0;i<=n;i++)o.a[i]=1LL*a[i]*k%mod;
49 return o;
50 }
51 poly operator * (poly k)const{
52 poly o;
53 o.n=n+k.n;
54 for(int i=0;i<=o.n;i++)o.a[i]=0;
55 for(int i=0;i<=n;i++)
56 for(int j=0;j<=k.n;j++)o.a[i+j]=(o.a[i+j]+1LL*a[i]*k.a[j])%mod;
57 return o;
58 }
59 poly dx(){
60 poly o;
61 o.n=n+1,o.a[0]=0;
62 for(int i=0;i<=n;i++)o.a[i+1]=1LL*inv[i+1]*a[i]%mod;
63 return o;
64 }
65 int get_val(int k){
66 int s=1,ans=0;
67 for(int i=0;i<=n;i++){
68 ans=(ans+1LL*s*a[i])%mod;
69 s=1LL*s*k%mod;
70 }
71 return ans;
72 }
73 }one,f[N][N<<1];
74 pair<frac,poly>a[N<<1];
75 int main(){
76 one.n=0,one.a[0]=1;
77 inv[0]=inv[1]=1;
78 for(int i=2;i<M-4;i++)inv[i]=1LL*(mod-mod/i)*inv[mod%i]%mod;
79 scanf("%d",&n);
80 for(int i=0;i<=n;i++)scanf("%d",&x[i]);
81 for(int i=0;i<=n;i++)
82 for(int j=0;j<i;j++){
83 if (i!=j)v.push_back(frac{x[i]-x[j],i-j});
84 if (i-1!=j)v.push_back(frac{x[i]-x[j],i-j-1});
85 if ((j)&&(i!=j-1))v.push_back(frac{x[i]-x[j],i-j+1});
86 }
87 sort(v.begin(),v.end());
88 frac lst=frac{0,1};
89 for(int i=0;i<v.size();i++)
90 if (lst<v[i]){
91 frac mid=frac{lst.x+v[i].x,lst.y+v[i].y};//通过mid来比较
92 for(int j=0;j<=n;j++){
93 poly o;
94 o.n=1,o.a[0]=x[j];
95 if (j){
96 o.a[1]=mod-j;
97 a[2*j-1]=make_pair(frac{x[j],1}+(-frac{j,1}*mid),o);
98 }
99 if (j<n){
100 o.a[1]=mod-(j+1);
101 a[2*j]=make_pair(frac{x[j],1}+(-frac{j+1,1}*mid),o);
102 }
103 }
104 sort(a,a+2*n);
105 for(int j=0;j<2*n;j++)f[0][j]=one;
106 for(int j=1;j<=n;j++){
107 l[j]=frac{x[j-1],1}+(-frac{j,1}*mid);
108 r[j]=frac{x[j],1}+(-frac{j,1}*mid);
109 for(int k=1;k<2*n;k++){
110 f[j][k]=f[j][k-1];
111 poly s=one;
112 for(int t=j;t;t--){
113 if ((a[k-1].first<l[t])||(r[t]<a[k].first))break;
114 s=s*(1LL*inv[x[t]-x[t-1]]*inv[j-t+1]%mod);
115 s=s*(a[k].second+(-a[k-1].second));
116 f[j][k]=f[j][k]+s*f[t-1][k-1];
117 }
118 }
119 }
120 poly s=f[n][2*n-1].dx();
121 ans=((ans+s.get_val(v[i].get_val()))%mod+mod-s.get_val(lst.get_val()))%mod;
122 lst=v[i];
123 }
124 printf("%d",ans);
125 }

[atARC113F]Social Distance的更多相关文章

  1. Opencv+Yolov3算法实现社交距离安全检测讲解和实战(Social Distance Detector)

    在我们进行交流谈话时,人与人之间总要保持一定的距离,尤其是在疫情的情况下,人与人之间更要保持一定的安全距离,今天给大家来介绍一个检测社交距离的项目,实现社交距离检测器. 社交距离(Social Dis ...

  2. Codeforces Round #650 (Div. 3) C. Social Distance

    题目链接:https://codeforces.com/contest/1367/problem/C 题意 给出一个长为 $n$ 的 $01$字符串,两个相邻 $1$ 间距应大于 $k$,初始序列合法 ...

  3. Codeforces Round #650 (Div. 3) C. Social Distance (前缀和)

    题意:有一排座位,要求每人之间隔\(k\)个座位坐,\(1\)代表已做,\(0\)代表空座,问最多能坐几人. 题解:我们分别从前和从后跑个前缀和,将已经有人坐的周围的位置标记,然后遍历求每一段连续的\ ...

  4. [题解] Atcoder ABC 225 H Social Distance 2 生成函数,分治FFT

    题目 首先还没有安排座位的\(m-k\)个人之间是有顺序的,所以先把答案乘上\((m-k)!\),就可以把这些人看作不可区分的. 已经确定的k个人把所有座位分成了k+1段.对于第i段,如果我们能求出这 ...

  5. Codeforces Round #783 (Div. 2)

    A. Direction Change 题意 从(1,1)点出发到(n,m),每次可以向上下左右四个方向移动,但是不能与上次移动方向相同 最少要移动多少不,如果不能到达输出 -1 思路 假设n< ...

  6. Social networks and health: Communicable but not infectious

    Harvard Men’s Health Watch Poet and pastor John Donne famously proclaimed “No man is an island.” It ...

  7. 文献阅读报告 - Social Ways: Learning Multi-Modal Distributions of Pedestrian Trajectories with GANs

    文献引用 Amirian J, Hayet J B, Pettre J. Social Ways: Learning Multi-Modal Distributions of Pedestrian T ...

  8. [LeetCode] Total Hamming Distance 全部汉明距离

    The Hamming distance between two integers is the number of positions at which the corresponding bits ...

  9. [LeetCode] Hamming Distance 汉明距离

    The Hamming distance between two integers is the number of positions at which the corresponding bits ...

随机推荐

  1. uniapp小程序迁移到TS

    uniapp小程序迁移到TS 我一直在做的小程序就是 山科小站 也已经做了两年了,目前是用uniapp构建的,在这期间也重构好几次了,这次在鹅厂实习感觉受益良多,这又得来一次很大的重构,虽然小程序功能 ...

  2. 洛谷4475 巧克力王国(KD-Tree + 维护子树和)

    (嘤嘤嘤 又是一个自闭了一晚上的题) qwq果然不是平面上的点的问题,也可以直接用KDTree打暴力 我们对于巧克力直接建kdtree 维护一个\(mx[i],mn[i]\) 但是有一个非常不友好的事 ...

  3. CVPR2021提出的一些新数据集汇总

    ​  前言  在<论文创新的常见思路总结>(点击标题阅读)一文中,提到过一些新的数据集或者新方向比较容易出论文.因此纠结于选择课题方向的读者可以考虑以下几个新方向.文末附相关论文获取方式. ...

  4. FastAPI 学习之路(九)请求体有多个参数如何处理?

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  5. Spring事件,ApplicationEvent在业务中的应用

    前言 关于事件驱动模型,百度百科在有明确的解释.在JDK的Util包里抽象了事件驱动,有兴趣的朋友可以自行去看下相关类的定义.Spring事件模型ApplicationEvent是基于JDK里的事件模 ...

  6. 深度剖析Redis6的持久化机制(大量图片说明,简洁易懂)

    Redis的强劲性能很大程度上是由于它所有的数据都存储在内存中,当然如果redis重启或者服务器故障导致redis重启,所有存储在内存中的数据就会丢失.但是在某些情况下,我们希望Redis在重启后能够 ...

  7. Sobol 序列并行化的实践经验

    目录 Sobol 序列并行化的实践经验 随机数发生器并行化的常见策略 Sobol 序列的原理和跳转功能 Sobol 序列并行化实践 分块策略 蛙跳策略 蛙跳策略的计算量分析 减少异或计算的技巧 分块策 ...

  8. Alpha Scrum Meeting汇总

    第一次Alpha Scrum Meeting 第二次Alpha Scrum Meeting 第三次Alpha Scrum Meeting 第四次Alpha Scrum Meeting 第五次Alpha ...

  9. [no code][scrum meeting] Alpha 8

    项目 内容 会议时间 2020-04-14 会议主题 API文档第一版交付 会议时长 30min 参会人员 PM+OCR组成员 $( "#cnblogs_post_body" ). ...

  10. 渗透测试神器——Burp的使用

    公众号:白帽子左一 版本说明:Burp Suite2.1 下载地址: 链接:https://pan.baidu.com/s/1JPV8rRjzxCL-4ubj2HVsug 提取码:zkaq 使用环境: ...