首页 > 其他分享 >【讲解】康托展开

【讲解】康托展开

时间:2023-08-28 23:22:37浏览次数:37  
标签:小于 排列 sum 讲解 展开 sim 康托

问题是这样的,给出一个 \(1\sim N\) 全排列,求在所有 \(1\sim N\) 全排列中的排名。

如果暴力枚举 \(1\sim N\) 每一个全排列,再 \(O(N)\) 判断是否符合,时间复杂度轻松爆炸,这时候便需要康托展开。

首先把这个 \(1\sim N\) 的全排列记为 \(A\),他从左往右的第 \(i\) 位记为 \(A_i\),问题就是有多少个 \(1\sim N\) 的全排列小于它,最后再 \(+1\)。

考虑第一位,任何以小于 \(A_1\) 开头的全排列肯定都小于 \(A\),令小于 \(A_1\) 的有 \(sum\) 个,这样的全排列就有 \(sum\times (N-1)!\) 个。

但是还没有完,因为等于 \(A_1\) 也有可能小于 \(A\),所以接下来就要考虑下一位。

令小于 \(A_2\) 的有 \(sum\) 个,但是有可能 \(A_1\) 小于 \(A_2\),如果把这个算进来就不符合全排列的定义,所以要删掉所有在前面已经出现过且小于 \(A_i\) 的数,而这样的全排列有 \(sum\times (N-2)!\) 个。

以此类推,答案自然就出来了,时间复杂度为 \(O(N^2)\)。

如果数据比较大,这样还是过不了,转化一下,第 \(i\) 项的 \(sum\) 的求法就是 \(\sum_{j=i+1}^{N}(A_j<A_i)\)。再转化一下就是 \(j>i\) 且 \(A_j<A_i\),典型二位偏序,可以树状数组优化。

冷门算法,不知道会不会考。

int ans=0;//表示最后的排名
for(int i=1;i<=n;i++){
	int x;scanf("%lld",&x);
	T.add(x,1);//树状数组T
	ans=(ans+(x-T.ask(x))*jc[n-i]%MOD)%MOD;//一般这种答案比较大,题目可能要求取模
}
printf("%lld",ans+1);//别忘了+1

经典题目:

【模板】康托展开 洛谷 (模板)

标签:小于,排列,sum,讲解,展开,sim,康托
From: https://www.cnblogs.com/HEIMOFA/p/17663664.html

相关文章

  • JVM 与 GC 讲解
    目录一、概述二、JVM内存模型三、GC算法和回收器1)垃圾回收算法2)垃圾回收器四、垃圾回收机制(GC)1)分代垃圾回收机制2)G1垃圾回收器3)FullGC机制一、概述JVM(JavaVirtualMachine)是一种在计算机上运行Java字节码的虚拟机。它允许Java程序在不同的操作系统上具有跨平台的能力,因为......
  • 语音直播讲解软件
      直播本身就是需要借助运用人员实现带货的,如果商家觉得运营成本太高的话,就可以借助直播软件了,语音直播讲解软件可以让用户通过语音进行交互式的讲解,让学习更加高效、便捷。本文将介绍语音直播讲解软件的主要功能和特点。  一、文字识别技术  语音直播讲解软件的核心......
  • 讲解pytorch的tensor没有移除某个元素的操作
    在PyTorch中,要从一个Tensor中移除一个元素,您需要使用索引操作来选择保留的元素,然后重新创建一个新的Tensor。由于PyTorch的Tensor是不可变的,所以无法直接在原Tensor上移除元素。下面是一个示例,展示了如何从一个PyTorchTensor中移除指定位置的元素:importtorch#......
  • DPDK-22.11.2 [四] 官方basicfwd编译运行讲解
    编译安装dpdk绑定网卡驱动vfio必须有两个网口配置LD_LIBRARY_PATH和PKG_CONFIG_PATH编译运行basicfwd.c/*SPDX-License-Identifier:BSD-3-Clause*Copyright(c)2010-2015IntelCorporation*/#include<stdint.h>#include<stdlib.h>#include<inttypes.h>#incl......
  • 人体感应太阳能灯原理图详细讲解
    人体感应太阳能灯原理图详细讲解三河凡科科技飞讯教学篇,人体感应太阳能灯是一种利用太阳能源供电,通过人体红外线感应技术实现智能控制灯源开关的照明设备。其原理是利用太阳能板将太阳能转化为电能,通过对电池的储存和管理,将电能存储在电池中,作为灯源使用时的电力供应。同时,通过人......
  • 业务讲解
    如何给完全不了解业务的人,讲解该业务1、该业务是干什么的;业务的一些专业术语、专业名词;业务是怎么盈利的?业务的资损点、业务客诉点?2、业务架构3、服务架构4、业务的生命周期5、业务涉及的具体功能点、测试点......
  • 详情讲解canvas实现电子签名
    签名的实现功能我们要实现签名:1.我们首先要鼠标按下,移动,抬起。经过这三个步骤。我们可以实现一笔或者连笔。按下的时候我们需要移动画笔,可以使用moveTo来移动画笔。e.pageX,e.pageY来获取坐标位置移动的时候我们进行绘制ctx.lineTo(e.pageX,e.pageY)ctx.stroke()......
  • 通过一个实际的 Fiori Elements 扩展开发需求,介绍什么是 SAP Fiori Extension API 试
    本教程前一篇文章,介绍了如何在SAPFioriElementsListReport应用的Table区域里创建自定义Action,并且在该Action对应按钮的点击事件处理函数里,使用JavaScript代码打印出当前选中的表格行项目的业务数据。效果如下图所示:前一篇教程的解决方案,根据按钮的press事件点......
  • SAP Fiori Elements List Report 如何在扩展开发里使用代码获得当前选中的表格行项目
    笔者从2007年电子科技大学计算机专业硕士毕业后加入SAP成都研究院,一直从事SAP产品设计和研发工作至今,对SAP多项技术有着深入透彻的研究,尤其精通ABAP编程,SAPUI5(Fiori)应用开发和SAPOData服务开发。笔者将自己在SAP领域16年(2007~2023)的技术沉淀,进行了系统的归......
  • python实现"对修改封闭, 对扩展开放"
    对修改封闭,对扩展开放是架构设计的基本原则.意思是如果程序增加新的功能,则不应该修改老的代码,只需要增加新的代码就可以了,这样可以避免对老功能的破坏,新增功能如果有问题,也很容易回退.python语言如何实现这个设计目标呢?可以使用我们之前提到的消息机制来实现:pyt......