【计数,DP】CF1081G Mergesort Strikes Back
现有一归并排序算法,但是算法很天才,设了个递归深度上限,如果递归深度到达 \(k\) 则立即返回。其它部分都和正常归并排序一样,递归中点是 \(\lfloor (l+r)/2 \rfloor\),归并每次取两边较小者加入结果。
给定 \(n,k\),求用这个算法对一个均匀随机的排列 \(p\) 排序后,\(p\) 的期望逆序对数是多少,答案对输入的质数取模。\(n,k\le 10^5\)。
技巧:\(\prod 1/\mathrm{siz}_u\)
首先注意到其实就是把那一车长度为 \(n/2^k\) 左右的区间同时拿来归并。
仔细想一想会发现如果选了一个数,它的下一个数比它小,那一定会跟着选下一个数。推下去可以发现就是每个区间的前缀最大值带着一串小兵一起以前缀最大值为关键字排序。
这道题是求“和的期望”,所以自然应该想到拆贡献。考虑两个位置 \(x,y\) 之间产生贡献的期望值是多少。
如果 \(x,y\) 在同一段区间,那由于同一段区间内相对顺序不变(前缀最大值递增),所以 \(x,y\) 为逆序对的概率即为 \(1/2\)。
如果 \(x,y\) 在不同区间,设 \(x\) 所在区间长度为 \(a\),\(y\) 所在区间长度为 \(b\),则贡献期望值显然只和 \(a,b\) 有关。又 \(a,b\) 只有两种取值,外层直接枚举即可。
现在 \(a,b\) 固定了。考虑钦定 \(x\) 在 \(y\) 前面构成逆序对的条件,设 \(x\) 左边的第一个前缀最大值为 \(p\),\(y\) 左边的第一个前缀最大值为 \(q\),则成立的充要条件为:\(B_y<A_x<A_p<B_q,\forall 1\le i<x,A_i<A_p,\forall 1\le j<y,B_j<B_q\)。其它位置可以随便填,无关紧要,这是这种做法正确的基础。
发现我们刚才需要成立的关系形成一棵树!根据经典结论,所有关系都成立的概率为 \(\prod 1/\mathrm{siz}_u\),其中 \(\mathrm{siz}_u\) 表示 \(u\) 的子树大小。
把暴力写出来,是 \(O(ab)\) 的。再推一推发现可以预处理倒数的前缀和优化,就线性了。
注意特判 \(p=x\) 的情况。

点击查看代码
#include <bits/stdc++.h>
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Rev(i,a,b) for(int i=a;i>=b;i--)
#define Fin(file) freopen(file,"r",stdin);
#define Fout(file) freopen(file,"w",stdout);
using namespace std;
const int N=1e5+5; using ll = long long;
int n,K,mod,inv[N],si[N];
int work(int a,int b){
int res=0;
For(i,1,a){
int tt=(b-1-1ll*(i+1)*(si[i+b]-si[i+1]+mod)%mod+mod)%mod;
res=(res+(1ll*inv[2]*(i-1)+1)%mod*inv[i+1]%mod*tt)%mod;
}
return res;
}
int main(){
cin>>n>>K>>mod; K--; K=min(K,18);
inv[1]=1; For(i,2,n+1) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
For(i,1,n+1) si[i]=(si[i-1]+inv[i])%mod;
int a=n>>K,b=a+1,cb=n-(a<<K),ca=(1<<K)-cb;
int ans=(1ll*a*(a-1)/2%mod*ca+1ll*b*(b-1)/2%mod*cb)%mod*inv[2]%mod;
ans=(ans+1ll*ca*(ca-1)%mod*work(a,a))%mod;
ans=(ans+1ll*cb*(cb-1)%mod*work(b,b))%mod;
ans=(ans+1ll*ca*cb%mod*work(a,b))%mod;
ans=(ans+1ll*cb*ca%mod*work(b,a))%mod;
cout<<ans<<'\n';
return 0;
}
【计数,DP】CF1081G Mergesort Strikes Back的更多相关文章
- CF1081G Mergesort Strikes Back
题目大意: 给定\(n\),\(k\),\(mod\),求随机排列在\(k\)层归并排序下逆序对的期望. 题解 考虑这\(k\)层归并会把序列分成若干个块. 这些块内的顺序是原序列的相对顺序,我们要把 ...
- HDU5800 To My Girlfriend 背包计数dp
分析:首先定义状态dp[i][j][s1][s2]代表前i个物品中,选若干个物品,总价值为j 其中s1个物品时必选,s2物品必不选的方案数 那么转移的时候可以考虑,第i个物品是可选可可不选的 dp[i ...
- CodeForces 176B Word Cut (计数DP)
Word Cut Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit St ...
- [DP之计数DP]
其实说实在 我在写这篇博客的时候 才刚刚草了一道这样类型的题 之前几乎没有接触过 接触过也是平时比赛的 没有系统的做过 可以说0基础 我所理解的计数dp就是想办法去达到它要的目的 而且一定要非常劲非常 ...
- HDU4815/计数DP
题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=4815] 简单说一下题意: 有n道题,每到题答对得分为a[ i ],假如A不输给B的最小概率是P,那么A ...
- HDU 6377 度度熊看球赛 (计数DP)
度度熊看球赛 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- 计数dp
计数dp 计数类的$dp$没做过几个,所以之前都放到"思维"标签下了,后来发现原来这属于一类问题啊...搬过来了. 管道取珠:https://www.lydsy.com/Judge ...
- [SDOI2010]地精部落[计数dp]
题意 求有多少长度为 \(n\) 的排列满足 \(a_1< a_2> a_3 < a_4 \cdots\) 或者 $a_1> a_2 < a_3 > a_4\cdo ...
- 【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas
[题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数 ...
- 【AtCoder】AGC022 F - Leftmost Ball 计数DP
[题目]F - Leftmost Ball [题意]给定n种颜色的球各k个,每次以任意顺序排列所有球并将每种颜色最左端的球染成颜色0,求有多少种不同的颜色排列.n,k<=2000. [算法]计数 ...
随机推荐
- AppCube视角浅析: 艾瑞咨询《2022年中国低代码行业研究报告》
摘要:近日,艾瑞咨询发布了<2022年中国低代码行业研究报告>,报告从企业数字化发展背景.低代码的发展路径.应用渗透.市场规模等方面进行深入研究分析,并洞察了发展趋势. 本文分享自华为云社 ...
- 知道ThreadLocal吗?一起聊聊到底有啥用
摘要:ThreadLocal是 java 提供的一个方便对象在本线程内不同方法中传递和获取的类.用它定义的变量,仅在本线程中可见和维护,不受其他线程的影响,与其他线程相互隔离. 本文分享自华为云社区& ...
- CWE4.6标准中加入 OWASP 2021 TOP10
摘要: 新发布的CWE4.6标准,加入了OWASP 2021 TOP10的视图. 本文分享自华为云社区<CWE 4.6 和 OWAPS TOP10(2021)>,作者: Uncle_Tom ...
- App加固中的代码混淆功能,让逆向工程师很头疼
App加固中的代码混淆功能,让逆向工程师很头疼 "我想离开浪浪山." 在数次尝试破解某个App 时,某个逆向工程师无奈感慨道. 逆向工程师顾名思义就是把一个个完整的软件逆推 ...
- 火山引擎DataLeap的Catalog系统搜索实践(三):Learning to rank与后续工作
Learning to rank Learning to rank主要分为数据收集,离线训练和在线预测三个部分.搜索系统是一个Data-driven system,因此火山引擎DataLeap的Cat ...
- Axure 多平台自适应
步骤一:设置自适应视图 1.新建两个页面分别命名为"PC版"和"移动版" 2.启动自适应视图: 条件为大于等于,宽为1024,继承于基本视图3.新建自适应视图& ...
- PPT 流星动画
https://www.bilibili.com/video/BV1w54y1Q7cZ?p=6 星空背景绘制 绘制矩形框 背景不再被拖动 处理前先复制一份,用于后面做激光效果 星星效果 再次组合 按S ...
- #1241: Oil Deposits(八向搜索 + 并查集)
Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- OpenSCA用开源的方式做开源风险治理:Why? What? How?
随着容器.微服务等新技术的快速迭代,开源软件已成为业界主流形态,开源和云原生时代的到来导致软件供应链越来越趋于复杂化和多样化,网络攻击者开始采用软件供应链攻击作为击破关键基础设施的的重要突破口,从而导 ...
- Serverless Devs 重大更新,基于 Serverless 架构的 CI/CD 框架:Serverless-cd
近日,Serverless 开发者平台 Serverless Devs 重磅发布基于 Serverless 架构的轻量级 CI/CD 框架--Serverless-cd.Serverless-cd 是 ...