首页 > 其他分享 >【计数,DP】CF1081G Mergesort Strikes Back

【计数,DP】CF1081G Mergesort Strikes Back

时间:2023-07-10 20:44:12浏览次数:42  
标签:Mergesort 前缀 CF1081G int inv Back si 最大值 mod

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;
}

标签:Mergesort,前缀,CF1081G,int,inv,Back,si,最大值,mod
From: https://www.cnblogs.com/Charlie-Vinnie/p/17541324.html

相关文章

  • springcloud -sentinel 用户自定义限流错误处理(仅限限流异常,其他异常请使用fallback属
    pom依赖<!--SpringCloudailibabanacos--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>......
  • xtrabackup 恢复报错:Assertion failure: log0files_finder.cc:322:format >= Log_form
     2023-07-10T15:33:46.614144+08:000[Note][MY-012204][InnoDB]Scanning'./'2023-07-10T15:33:46.647712+08:000[Note][MY-012208][InnoDB]CompletedspaceIDcheckof229files.2023-07-10T15:33:46.648265+08:000[Note][MY-012955][InnoDB]Ini......
  • 【快应用】快应用学习之页面周期函数onBackPress无法触发?
    ​【关键词】onBackPress、退出提示 【问题背景】在学习和调试快应用的过程中,我在子页面中的onBackPress()函数中定制了退出的一个弹框提醒,将它作为组件引入父页面中,弹框却无法触发?问题代码如下:子页面<template><!--Onlyonerootnodeisallowedintemplate.--><......
  • Visual Studio2019 BackgoroundImageLayout属性
    ​BackgroundImageLayout属性值背景图片重复:BackgroundImageLayout属性设置为Tile(默认)背景图片左边显示:BackgroundImageLayout属性设置为None背景图片右边显示:BackgroundImageLayout属性设置为None,同时RightToLeft属性设置为Yes背景图片居中显示:BackgroundImageLayout属性设......
  • historyApiFallback的解释
    historyApiFallback是一个webpack-dev-server的配置选项,用于解决使用HTML5HistoryAPI实现的前端路由在开发环境下的问题。它的原理是将没有匹配到静态文件的请求重定向到指定的HTML文件,通常是前端应用程序的入口文件。具体原理如下:当使用webpack-dev-server启动开发服务器时......
  • 【论文阅读】Pyramid Vision Transformer: A Versatile Backbone for Dense Predictio
    来自ICCV2021论文地址:[2102.12122]PyramidVisionTransformer:AVersatileBackboneforDensePredictionwithoutConvolutions(arxiv.org)代码地址:https://link.zhihu.com/?target=https%3A//github.com/whai362/PVT一、Motivation1.将金字塔结构引入视觉Transformer,使......
  • SpringBoot项目从0到1配置logback日志打印
    大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。以下是正文!一、写文背景我们在写后端项目的时候,日志打印是必需的。支持SpringBoot项目的日志框架一般有log4j、logback,这二者各有优......
  • Twisted @defer.inlineCallbacks
    @defer.inlineCallbacks是Twisted框架中的一个装饰器,用于定义基于协程的异步函数。在使用Twisted进行异步编程时,常见的方式是使用回调函数来处理异步操作的结果。但是使用回调函数可能会导致代码复杂、难以维护和阅读。因此,Twisted提供了@defer.inlineCallbacks装饰器,通......
  • BackUpLogView 系列 - 系统基础软件下载
    --------------------------------------------------------------------------------------------------------索引:1.   一步一步做好全院数据备份之一:系统基础软件下载2.    一步一步做好全院数据备份之一:生成日志数据库脚本(MSSqlServer)3.    一步一步做好......
  • BackUpLogView 系列 - 主应用程序下载
     主应用程序下载   TRANSLATEwithxEnglishArabicHebrewPolishBulgarianHindiPortugueseCatalanHmongDawRomanianChineseSimplifiedHungarianRussianChineseTraditionalIndonesianSlovakCzechItalianSlovenianDanishJa......