【题目】HDU P6595(C849E)Everything Is Generated In Equal Probability

本文探讨了一种算法,用于计算随机生成的整数排列的特定函数CALCULATE()的期望值。通过定义子序列、逆序对数等概念,采用动态规划方法,实现了高效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意

给出一个整数NNN和一段程序(包括三个函数):

  • SUBSEQUENCE(Array)\text{SUBSEQUENCE(}Array\text)SUBSEQUENCE(Array):随机返回ArrayArrayArray的一个子序列(可为空)。
  • CNT-INVERSION-PAIRS(Array)\text{CNT-INVERSION-PAIRS(}Array\text)CNT-INVERSION-PAIRS(Array):返回ArrayArrayArray的逆序对数。
  • CALCULATE(Array)\text{CALCULATE(}Array\text)CALCULATE(Array):若ArrayArrayArray为空,返回000;否则返回CNT-INVERSION-PAIRS(Array)+CALCULATE(SUBSEQUENCE(Array))\text{CNT-INVERSION-PAIRS(}Array\text)+\text{CALCULATE(SUBSEQUENCE(}Array\text{))}CNT-INVERSION-PAIRS(Array)+CALCULATE(SUBSEQUENCE(Array))

先随机生成一个整数n∈[1,N]n\in[1,N]n[1,N],再随机生成一个长度为nnn的排列,求这个排列的CALCULATE()\text{CALCULATE()}CALCULATE()函数的期望值。
有多组测试数据,每组数据N⩽3000N\leqslant 3000N3000


思路

先求出长度为nnn的排列的CNT-INVERSION-PAIRS()\text{CNT-INVERSION-PAIRS()}CNT-INVERSION-PAIRS()函数的期望值,有两种思路:

思路1: 长度为nnn的排列中一共有Cn2C_n^2Cn2对数对,每一对逆序的概率为12\frac 1221,累加起来就是
Cn22=n!2(2!)(n−2)!=n(n−1)4\frac{C_n^2}2=\frac{n!}{2(2!)(n-2)!}=\frac{n(n-1)}42Cn2=2(2!)(n2)!n!=4n(n1)

思路2: 设该期望值对应的状态为dp1[n]dp_1[n]dp1[n],显然dp1[1]=0dp_1[1]=0dp1[1]=0dp1[2]=12dp_1[2]=\frac 12dp1[2]=21。考虑将数字nnn插入111n−1n-1n1的排列中,一共有nnn个位置可插入,增加的逆序对数分别为0,1,2,…,n−10,1,2,\dots,n-10,1,2,,n1,于是得到
dp1[n]=dp1[n−1]+0+1+2+⋯+(n−1)n=dp1[n−1]+n−12dp1[n]=n(n−1)4\begin{aligned} dp_1[n]&=dp_1[n-1]+\frac{0+1+2+\cdots+(n-1)}n\\ &=dp_1[n-1]+\frac{n-1}2\\ dp_1[n]&=\frac{n(n-1)}4 \end{aligned}dp1[n]dp1[n]=dp1[n1]+n0+1+2++(n1)=dp1[n1]+2n1=4n(n1)

再求长度为nnn的排列的CALCULATE()\text{CALCULATE()}CALCULATE()函数的期望值。设该期望值对应的状态为dp2[n]dp_2[n]dp2[n],其中dp2[1]=0dp_2[1]=0dp2[1]=0。由题意不难得到
dp2[n]=dp1[n]+∑i=0nCni⋅dp2[i]∑i=0nCni=n(n−1)4+∑i=0n−1Cni⋅dp2[i]2n+dp2[n]2ndp2[n]=2n−2n(n−1)+∑i=0n−1Cni⋅dp2[i]2n−1\begin{aligned} dp_2[n]&=dp_1[n]+\frac{\sum_{i=0}^nC_n^i\cdot dp_2[i]}{\sum_{i=0}^nC_n^i}\\ &=\frac{n(n-1)}4+\frac{\sum_{i=0}^{n-1}C_n^i\cdot dp_2[i]}{2^n}+\frac{dp_2[n]}{2^n}\\ dp_2[n]&=\frac{2^{n-2}n(n-1)+\sum_{i=0}^{n-1}C_n^i\cdot dp_2[i]}{2^n-1} \end{aligned}dp2[n]dp2[n]=dp1[n]+i=0nCnii=0nCnidp2[i]=4n(n1)+2ni=0n1Cnidp2[i]+2ndp2[n]=2n12n2n(n1)+i=0n1Cnidp2[i]

于是可以递推求出dp2[n]dp_2[n]dp2[n],时间复杂度O(n2)O(n^2)O(n2)
计算出dp2[n]dp_2[n]dp2[n]后,由于n∈[1,N]n\in[1,N]n[1,N],显然
ans=∑n=1Ndp2[n]Nans=\frac{\sum_{n=1}^Ndp_2[n]}Nans=Nn=1Ndp2[n]

预处理dp2[n]dp_2[n]dp2[n]的前缀和后就可以O(log⁡2n)O(\log_2n)O(log2n)求解。如果预处理了NNN的逆元,求解可以达到O(1)O(1)O(1)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值