Problem Link

现有一归并排序算法,但是算法很天才,设了个递归深度上限,如果递归深度到达 \(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的更多相关文章

  1. CF1081G Mergesort Strikes Back

    题目大意: 给定\(n\),\(k\),\(mod\),求随机排列在\(k\)层归并排序下逆序对的期望. 题解 考虑这\(k\)层归并会把序列分成若干个块. 这些块内的顺序是原序列的相对顺序,我们要把 ...

  2. HDU5800 To My Girlfriend 背包计数dp

    分析:首先定义状态dp[i][j][s1][s2]代表前i个物品中,选若干个物品,总价值为j 其中s1个物品时必选,s2物品必不选的方案数 那么转移的时候可以考虑,第i个物品是可选可可不选的 dp[i ...

  3. CodeForces 176B Word Cut (计数DP)

    Word Cut Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit St ...

  4. [DP之计数DP]

    其实说实在 我在写这篇博客的时候 才刚刚草了一道这样类型的题 之前几乎没有接触过 接触过也是平时比赛的 没有系统的做过 可以说0基础 我所理解的计数dp就是想办法去达到它要的目的 而且一定要非常劲非常 ...

  5. HDU4815/计数DP

    题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=4815] 简单说一下题意: 有n道题,每到题答对得分为a[ i ],假如A不输给B的最小概率是P,那么A ...

  6. HDU 6377 度度熊看球赛 (计数DP)

    度度熊看球赛 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  7. 计数dp

    计数dp 计数类的$dp$没做过几个,所以之前都放到"思维"标签下了,后来发现原来这属于一类问题啊...搬过来了. 管道取珠:https://www.lydsy.com/Judge ...

  8. [SDOI2010]地精部落[计数dp]

    题意 求有多少长度为 \(n\) 的排列满足 \(a_1< a_2> a_3 < a_4 \cdots\) 或者 $a_1> a_2 < a_3 > a_4\cdo ...

  9. 【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是素数 ...

  10. 【AtCoder】AGC022 F - Leftmost Ball 计数DP

    [题目]F - Leftmost Ball [题意]给定n种颜色的球各k个,每次以任意顺序排列所有球并将每种颜色最左端的球染成颜色0,求有多少种不同的颜色排列.n,k<=2000. [算法]计数 ...

随机推荐

  1. RDS:一致性处理事务的神器

    摘要:RDS关系型数据库是一种基于云计算平台的即开即用.稳定可靠.弹性伸缩.便捷管理的在线关系型数据库服务. 本文分享自华为云社区<一致性处理事务这下还是看RDS的吧[秋招特训]>,作者: ...

  2. 4问教你搞定java中的ThreadLocal

    摘要:ThreadLocal是除了加锁同步方式之外的一种保证规避多线程访问出现线程不安全的方法. 本文分享自华为云社区<4问搞定java中的ThreadLocal>,作者:breakDra ...

  3. 基于CREATE TYPE语法自定义新数据类型

    摘要:介绍CREATE TYPE语法可以在数据库中定义一种新的数据类型. 本文分享自华为云社区<GaussDB(DWS)数据类型之自定义数据类型(复合类型)>,作者: 清道夫. CREAT ...

  4. CentOS7与centOS8的抉择

    目前国内各大云服务器的默认centos 系统版本还是7,vultr,centos只有8了 官网,下载,默认也是8,作为本地主机玩的服务器,还是试一下centos8 国外下载之前版本,下载链接: 官网默 ...

  5. PPT 动画-树叶摆动

    插入树叶 插入矩形,长宽放大1倍 树叶和矩形组合

  6. python 读取数据调翻译更新表字段

    import time import requests import pymysql import datetime import random from hashlib import md5 imp ...

  7. 精细化边缘安全防护:如何防止CDN域名被恶意刷量?

    越是数字化时代,越要做好基建"安全"的顶层设计 随着消费及产业互联网的不断发展,数字化将实现全场景覆盖,人类的生活和生产方式也随之不断改变. 内容分发网络CDN(Content D ...

  8. SpringBoot 学习笔记:运维篇

    SpringBoot程序的打包和运行 开发部门使用Git.SVN等版本控制工具上传工程到版本服务器 服务器使用版本控制工具下载工程 服务器上使用Maven工具在当前真机环境下重新构建项目 启动服务 程 ...

  9. C. Given Length and Sum of Digits... (贪心)

    https://codeforces.com/problemset/problem/489/C C. Given Length and Sum of Digits... You have a posi ...

  10. Codeforces Round #697 (Div. 3) A - G个人题解记录

    Codeforces Round #697 (Div. 3) 1475A. Odd Divisor 问一个数是否有奇除数. 对 2 不断除,如果最后 n == 1即不可能存在,否在存在. int ma ...