O(n2)方法:

 namespace Cantor {
const int N=;
int fac[N];
void init() {
fac[]=;
for(int i=; i<N; ++i)fac[i]=fac[i-]*i;
}
int encode(int* a,int n) {
int ret=;
for(int i=n-; i>=; --i) {
int cnt=;
for(int j=i+; j<n; ++j)if(a[j]<a[i])++cnt;
ret+=cnt*fac[n--i];
}
return ret;
}
vector<int> decode(int x,int n) {
vector<int> ret;
vector<int> v;
for(int i=; i<=n; ++i)v.push_back(i);
for(int i=n-; i>=; --i) {
ret.push_back(v[x/fac[i]]);
v.erase(v.begin()+x/fac[i]);
x%=fac[i];
}
return ret;
}
}

O(nlogn)方法(树状数组辅助):

 namespace Cantor {
const int N=;
int fac[N],c[N],n,m;
void init() {
fac[]=;
for(int i=; i<N; ++i)fac[i]=fac[i-]*i;
}
void setn(int _n) {
n=_n;
m=;
while(m<=n)m<<=;
for(int i=; i<m; ++i)c[i]=;
}
int lowbit(int x) {
return x&-x;
}
void add(int u,int x) {
while(u<m) {
c[u]+=x;
u+=lowbit(u);
}
}
int rnk(int u) {
int ret=;
while(u) {
ret+=c[u];
u-=lowbit(u);
}
return ret;
}
int kth(int k) {
int ret=;
for(int i=m>>; i; i>>=) {
if(c[ret+i]<k) {
ret+=i;
k-=c[ret];
}
}
return ret+;
}
int encode(int* a,int _n) {
setn(_n);
int ret=;
for(int i=n-; i>=; --i) {
ret+=rnk(a[i])*fac[n--i];
add(a[i],);
}
return ret;
}
vector<int> decode(int x,int _n) {
setn(_n);
vector<int> ret;
for(int i=; i<=n; ++i)add(i,);
for(int i=n-; i>=; --i) {
int t=kth(x/fac[i]+);
ret.push_back(t);
add(t,-);
x%=fac[i];
}
return ret;
}
}

测试代码:

 int main() {
Cantor::init();
int a[]= {,,,};
do {
printf("%d\n",Cantor::encode(a,));
} while(next_permutation(a,a+));
for(int i=; i<; ++i) {
vector<int> v=Cantor::decode(i,);
for(int i=; i<v.size(); ++i)printf("%d%c",v[i]," \n"[i==v.size()-]);
}
return ;
}

输出结果:


康托展开与逆康托展开模板(O(n^2)/O(nlogn))的更多相关文章

  1. nyoj 139——我排第几个|| nyoj 143——第几是谁? 康托展开与逆康托展开

    讲解康托展开与逆康托展开.http://wenku.baidu.com/view/55ebccee4afe04a1b071deaf.html #include<bits/stdc++.h> ...

  2. 康拓展开 & 逆康拓展开 知识总结(树状数组优化)

    康拓展开 : 康拓展开,难道他是要飞翔吗?哈哈,当然不是了,康拓具体是哪位大叔,我也不清楚,重要的是 我们需要用到它后面的展开,提到展开,与数学相关的,肯定是一个式子或者一个数进行分解,即 展开. 到 ...

  3. HDU1027 Ignatius and the Princess II( 逆康托展开 )

    链接:传送门 题意:给出一个 n ,求 1 - n 全排列的第 m 个排列情况 思路:经典逆康托展开,需要注意的时要在原来逆康托展开的模板上改动一些地方. 分析:已知 1 <= M <= ...

  4. LightOJ1060 nth Permutation(不重复全排列+逆康托展开)

    一年多前遇到差不多的题目http://acm.fafu.edu.cn/problem.php?id=1427. 一开始我还用搜索..后来那时意外找到一个不重复全排列的计算公式:M!/(N1!*N2!* ...

  5. 题解报告:NYOJ 题目143 第几是谁?(逆康托展开)

    描述 现在有"abcdefghijkl”12个字符,将其按字典序排列,如果给出任意一种排列,我们能说出这个排列在所有的排列中是第几小的.但是现在我们给出它是第几小,需要你求出它所代表的序列. ...

  6. 康托展开&逆康托展开学习笔记

    啊...好久没写了...可能是最后一篇学习笔记了吧 题目大意:给定序列求其在全排列中的排名&&给定排名求排列. 这就是康托展开&&逆康托展开要干的事了.下面依次介绍 一 ...

  7. Codeforces-121C(逆康托展开)

    题目大意: 给你两个数n,k求n的全排列的第k小,有多少满足如下条件的数: 首先定义一个幸运数字:只由4和7构成 对于排列p[i]满足i和p[i]都是幸运数字 思路: 对于n,k<=1e9 一眼 ...

  8. CDOJ 485 UESTC 485 Game (八数码变形,映射,逆cantor展开)

    题意:八数码,但是转移的方式是转动,一共十二种,有多组询问,初态唯一,终态不唯一. 题解:初态唯一,那么可以预处理出012345678的所有转移情况,然后将初态对012345678做一个映射,再枚举一 ...

  9. hdu 1027 Ignatius and the Princess II(正、逆康托)

    题意: 给N和M. 输出1,2,...,N的第M大全排列. 思路: 将M逆康托,求出a1,a2,...aN. 看代码. 代码: int const MAXM=10000; int fac[15]; i ...

随机推荐

  1. Spring Boot之AOP面向切面编程-实战篇

    目录 前言 编程范式主要有以下几类 引入pom依赖 aop注解 实现日志分割功能 前言 AOP是一种与语言无关的程序思想.编程范式.项目业务逻辑中,将通用的模块以水平切割的方式进行分离统一处理,常用于 ...

  2. settings配置 文件操作

    设置文件路径 import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 这里用到了python中一个神奇的变量 __file__ ...

  3. Hexo 使用中搭建博客过程中遇到的坑

    本地执行hexo s 时报错: WARN No layout: index.html 原因:theme 没有下载下来,经查,theme文件夹下为空. 新建文章后,执行 hexo g 时报如下错误: ( ...

  4. Hibernate学习---关联关系映射

    关联关系是用到的最多的一种关系,非常重要,在内存中反映为实体关系,映射到DB中主键外键关系,实体间的关联,即对外键的维护,关联关系的发生,即对外键数据的改变. 在这里就不赘述什么是外键什么是主键了. ...

  5. Python的文件读写与存储

    文件读写与存储 7.2. 读写文件 open()返回一个文件对象,最常见的用法带有两个参数:open(filename, mode). >>> f = open('workfile' ...

  6. CentOs linux安装SVN服务

    SVN服务器有2种运行方式:1.独立服务器(例如:svn://xxx.com/xxx):2.借助apache   (例如:http://svn.xxx.com/xxx):为了不依赖apache,我选择 ...

  7. 语义web基础知识学习

    最近找了一本书,<语义web技术基础>----Pascal Hitzler等编著的.因为最近在看关于自然语言处理的一些东西,就顺带翻了一下,做一点学习笔记,方便以后查看. 本书的作者 Pa ...

  8. Hadoop学习1(初识hadoop)

    Hadoop生态系统的特点 1)源代码开源 2)社区活跃,参与者多 3)涉及分布式存储和计算的各方面 4)已得到企业界的验证 Hadoop构成 1) 分布式文件系统HDFS(Hadoop Distri ...

  9. SpringCloud-路由网关(Zuul)

    在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.只能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统. 在Spring Cloud ...

  10. 简介web服务器的工作原理

    一 什么是web服务器,应用服务器和web容器? 对于web服务器与应用服务器:“在过去它们是有区别的,但是这两个不同的分类慢慢地合并了,而如今在大多在情况下和使用中可以把它们看成一个整体.” 但是当 ...