[PKUSC2022]Rating
Posted StaroForgin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[PKUSC2022]Rating相关的知识,希望对你有一定的参考价值。
Rating
题解
可怜的我考场上拿了0分
首先看到这道题了,我们容易定义出一个比较简单的
d
p
dp
dp,用
d
p
i
,
j
dp_i,j
dpi,j表示较大数为
i
i
i,较小的数为
j
j
j的概率。
本来定义到这里就可以了,我们将所有状态的概率直接加起来就可以得到答案了,这里为了方便我们再多定义一个
g
p
i
,
j
gp_i,j
gpi,j表示到达该状态的期望步数。
然后,我们可以简单地写出它的转移方程式:
p
k
d
p
i
,
j
→
d
p
i
,
j
+
k
/
d
p
i
+
k
,
j
p
k
(
g
p
i
,
j
+
d
p
i
,
j
)
→
g
p
i
,
j
+
k
/
g
p
i
+
k
,
j
p_kdp_i,j\\rightarrow dp_i,j+k/dp_i+k,j\\\\ p_k(gp_i,j+dp_i,j)\\rightarrow gp_i,j+k/gp_i+k,j
pkdpi,j→dpi,j+k/dpi+k,jpk(gpi,j+dpi,j)→gpi,j+k/gpi+k,j注意,第二个方程的位置必须是加上
d
p
i
,
j
dp_i,j
dpi,j,因为前面的
g
p
i
,
j
gp_i,j
gpi,j表示的是每种路径被使用的概率乘上每种路径的长度,扩展一步就是每种情况。
所以这里加上的应该是到达该点的概率,而不是
1
1
1。
由于下一层的值是不会影响上一层的,我们可以先将每一层的
d
p
dp
dp值消元解出后,再去解下一层的方程。
接着方程我们事实上最多也只能优化到
O
(
m
n
3
)
O\\left(mn^3\\right)
O(mn3),看起来不太像能过的样子,我们考虑优化。
如果真要优化的,显然也就不能用列方程组的方法了。
我们可以考虑一些顺推的
d
p
dp
dp,我们不妨再多定义一个
f
i
,
j
,
g
i
,
j
f_i,j,g_i,j
fi,j,gi,j表示从
i
i
i出发走到第一个大于
i
i
i的点为
i
+
j
i+j
i+j的概率与期望花费。
考虑怎么将这东西快速地预处理出来,定义
h
i
,
j
,
h
p
i
,
j
h_i,j,hp_i,j
hi,j,hpi,j表示从
i
i
i出发后不再走大于
j
j
j的点第一次走到
j
j
j概率与期望距离。
我们先枚举从
i
i
i出发走的第一步
k
k
k,将它贡献到
h
i
,
i
+
k
h_i,i+k
hi,i+k上,显然这个
i
+
k
i+k
i+k可能比
i
i
i小,也可能比
i
i
i大。
大丈夫です,对于比
i
i
i小的部分,它的
d
p
dp
dp值不是已经预处理出来了吗,它就可以从比较小的
h
j
h_j
hj贡献到较大的
h
k
(
k
>
j
)
h_k(k>j)
hk(k>j)。
这样,我们就能将
<
i
<i
<i出的
h
h
h值转移到
⩾
i
\\geqslant i
⩾i处。
那么我们考虑,如何将这个
h
h
h算到我们的
f
f
f值上呢?显然,
h
i
,
i
h_i,i
hi,i相当于走了一个环,又走回到了
i
i
i上的概率与期望,而大于
i
i
i的部分会直接贡献到其它
f
f
f值的贡献。
可以计算出
f
i
,
j
f_i,j
fi,j对
f
i
,
k
/
f
k
,
i
(
k
>
j
)
f_i,k/f_k,i(k>j)
fi,k/fk,i(k>j)的贡献为
h
k
1
−
h
i
\\frach_k1-h_i
1−hihk,对
g
i
,
k
/
g
k
,
i
g_i,k/g_k,i
gi,k/gk,i的贡献为
h
p
k
(
1
−
h
i
)
+
h
p
i
h
k
(
1
−
h
i
)
2
\\frachp_k(1-h_i)+hp_ih_k(1-h_i)^2
(1−hi)2hpk(1−hi)+hpihk。
这样我们就可以在
O
(
n
m
2
)
O\\left(nm^2\\right)
O(nm2)的时间内完成我们的预处理。
有了上面的
f
f
f与
g
g
g,我们自然而然就很容易得到
d
p
dp
dp的转移方法。
显然,我们只需要枚举较小的数下一个变到的比他大的数是什么就行了。
这部分的转移就可以做到
O
(
n
m
2
)
O\\left(nm^2\\right)
O(nm2)。
总时间复杂度 O ( n m 2 ) O\\left(nm^2\\right) O(nm2)。
源码
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1055
#define lowbit(x) (x&-x)
#define reg register
#define pb push_back
#define mkpr make_pair
#define fir first
#define sec second
typedef long long LL;
typedef unsigned long long uLL;
typedef long double Ld;
typedef pair<int,int> pii;
const LL INF=以上是关于[PKUSC2022]Rating的主要内容,如果未能解决你的问题,请参考以下文章