【计数,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. [算法]计数 ...
随机推荐
- 数据智能——DTCC2022!中国数据库技术大会即将开幕
关注DTCC有几年了,还是在当中学到了很多的干货.今年我的大部分时间也都是投入在了数据治理的学习和数据治理工具的调研中.也非常渴望有这种机会去了解一下国内顶尖公司这方面的前沿技术与应用. DTCC ...
- 年搜索量超 7 亿次背后:这款 APP 用火山引擎 DataTester 完成“数据驱动”
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 双十一刚过,双十二在即,随着线上营销玩法的层出不穷,各平台之间的价格逐渐"内卷".消费者对跨平 ...
- Markdown 图片居中显示,增加图片说明
<center> <img src="https://img2023.cnblogs.com/blog/80824/202308/80824-202308081307138 ...
- 7z压缩测试
注意: CompressionLevel 选择
- Sublime Text 汉化 中文
Ctrl+Shift+P 安装 ChineseLocalizations 包 如下图 或者 Preferences -> Package Control
- Java 网络编程 —— 基于 UDP 的数据报和套接字
UDP 简介 UDP(User Datagram Protocol,用户数据报协议)是传输层的另一种协议,比 TCP 具有更快的传输速度,但是不可靠.UDP 发送的数据单元被称为 UDP 数据报,当网 ...
- Java基础知识整理,驼峰规则、流程控制、自增自减
写在开头 本文接着上一篇文章续写哈.[Java基础知识整理,注释.关键字.运算符](https://blog.csdn.net/qq_43506040/article/details/13563332 ...
- Codeforces Round #719 (Div. 3) A~E题解
51鸽了几天,有几场比赛的题解还没发布,今天晚上会补上的 1520A. Do Not Be Distracted! 问题分析 模拟,如果存在已经出现的连续字母段则输出NO using ll = lon ...
- 涂色游戏Flood-it!(IDA star算法) - HDU 4127
做题之前,可以先到下面这个网站玩一会游戏: https://unixpapa.com/floodit/?sz=14&nc=6 游戏开发里面,比较常用的一个搜索算法是寻路算法,寻路算法里面用的最 ...
- 智慧地产-售楼中心 3D 沙盘可视化
前言 随着"互联网+房地产"走入全国各大地产项目,房企依托互联网将房地产从传统地产转向智慧地产已然是眼下用户最欢迎的转型模式.智慧地产是由智慧社区.智慧园区.智慧公寓及智能家居等组 ...