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

定义$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. PHP审计之PHP反序列化漏洞

    PHP审计之PHP反序列化漏洞 前言 一直不懂,PHP反序列化感觉上比Java的反序列化难上不少.但归根结底还是serialize和unserialize中的一些问题. 在此不做多的介绍. 魔术方法 ...

  2. C++类结构体与json相互转换

    1. 背景与需求 之前写C#的时候,解析json字符串一般使用的是开源的类库Newtonsoft.Json,方法十分简洁,比如: class Project { public string Input ...

  3. 如何利用Prometheus监控你的应用(此列子是对于golang sdk进行运用)

    Prometheus作为一套完整的开源监控接近方案,因为其诸多强大的特性以及生态的开放性,俨然已经成为了监控领域的事实标准并在全球范围内得到了广泛的部署应用.那么应该如何利用Prometheus对我们 ...

  4. mysql select语句查询流程是怎么样的

    select查询流程是怎么样的 mysql select查询的数据是查询内存里面,如果没有查询的数据没有在内存,就需要mysql的innodb引擎读取磁盘,将数据加载的内存后在读取.这就体现了,mys ...

  5. 好奇!仅 13kB 大小的游戏,源码长啥样?

    这个马赛克风格的表情正好 13Kb,有人竟然能用一个表情大小的空间,制作个游戏出来.我就不信这么点的地儿,能写出个花来?游戏能好玩吗?因为这些游戏点开就能玩,我抱着试一试的心态把玩了一会. 事实证明是 ...

  6. C语言中while 语句

    while的执行顺序 while 循环的执行顺序非常简单,它的格式是: while (表达式) { 语句: } 概念:当表达式为真,则执行下面的语句:语句执行完之后再判断表达式是否为真,如果为真,再次 ...

  7. BUAA2020软工作业(二)——对软件工程的初步理解

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 我在这个课程的目标是 进一步提高自己的编码能力,工程能力 这个作业在哪个具体方面帮助 ...

  8. 2021.9.9考试总结[NOIP模拟50]

    T1 第零题 神秘结论:从一个点满体力到另一个点的复活次数与倒过来相同. 于是预处理出每个点向上走第$2^i$个死亡点的位置,具体实现可以倍增或二分. 每次询问先从两个点同时向上倍增,都转到离$LCA ...

  9. C语言编程基础有网盘资料哦

    刚开始看STM32的库函数,会有很多疑惑,例如指针怎么用,结构体跟指针怎么配合,例如函数的参数有什么要求,如何实时更新IO口的数据等.如果重新进行C语言的学习,那么要学很久才能够系统地认识.本文则将比 ...

  10. 攻防世界 web5.disabled_button

    我觉得戴上手套按应该可以! 方法一: 打开网址,发现flag按钮无法点击,F12查看源代码,删除disabled=" ",flag就点击了. 方法二 POST请求, 先分析一下源代 ...