[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,jdpi,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 1hihk,对 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 (1hi)2hpk(1hi)+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的主要内容,如果未能解决你的问题,请参考以下文章

[PKUSC2022]随机函数

PKUSC 2022游记

力扣 每日一题 1235. 规划兼职工作难度:困难,rating: 2022(动态规划+二分查找)

loj6437 PKUSC2018 PKUSC 计算几何

PKUSC2018游记

[PKUSC2018]最大前缀和