康托展开

康托展开为全排列到一个自然数的映射, 空间压缩效率很高。

简单来说, 康托展开就是一个全排列在所有此序列全排列字典序中的第 \(k\) 大, 这个 \(k\) 即是次全排列的康托展开。

康托展开是这样计算的: 对于每一位, 累计除了前面部分, 字典序小于本位的排列总数, 即

LL cantor(){
LL ans = 0;
for(LL i = 1;i <= num;i++){
LL cnt = 0;
for(LL j = i + 1;j <= num;j++){
if(ask[j] < ask[i])cnt++;//后方比自己小
}
ans += cnt * fac[num - i];//这一位的排列总数
}
return ans + 1;
}

康托逆展开

有康托展开的计算可得, 此映射是可逆的

bool vis[maxn];
void reverse_cantor(LL INDEX){
memset(vis, 0, sizeof(vis));
INDEX--;
LL j;
for(LL i = 1;i <= num;i++){
LL t = INDEX / fac[num - i];
for(j = 1;j <= num;j++){
if(!vis[j]){
if(!t)break;
t--;
}
}
vis[j] = 1;
printf("%lld ", j);
INDEX %= fac[num - i];
}
puts("");
}

P3014 [USACO11FEB]牛线Cow Line

题意: 求康托展开和康托逆展开

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
typedef long long LL;
using namespace std;
LL RD(){
LL out = 0,flag = 1;char c = getchar();
while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
const LL maxn = 25;
LL num, na;
LL fac[maxn];
void get_fac(){
fac[0] = 1;
for(LL i = 1;i <= num;i++)fac[i] = fac[i - 1] * i;
}
LL ask[maxn];
LL cantor(){
LL ans = 0;
for(LL i = 1;i <= num;i++){
LL cnt = 0;
for(LL j = i + 1;j <= num;j++){
if(ask[j] < ask[i])cnt++;
}
ans += cnt * fac[num - i];
}
return ans + 1;
}
bool vis[maxn];
void reverse_cantor(LL INDEX){
memset(vis, 0, sizeof(vis));
INDEX--;
LL j;
for(LL i = 1;i <= num;i++){
LL t = INDEX / fac[num - i];
for(j = 1;j <= num;j++){
if(!vis[j]){
if(!t)break;
t--;
}
}
vis[j] = 1;
printf("%lld ", j);
INDEX %= fac[num - i];
}
puts("");
}
int main(){
num = RD();na = RD();
get_fac();
char cmd;
for(LL i = 1;i <= na;i++){
cin>>cmd;
if(cmd == 'P')reverse_cantor(RD());
else{
for(LL j = 1;j <= num;j++)ask[j] = RD();
printf("%lld\n", cantor());
}
}
return 0;
}

P3014 [USACO11FEB]牛线Cow Line && 康托展开的更多相关文章

  1. [洛谷P3014][USACO11FEB]牛线Cow Line (康托展开)(数论)

    如果在阅读本文之前对于康托展开没有了解的同学请戳一下这里:  简陋的博客    百度百科 题目描述 N(1<=N<=20)头牛,编号为1...N,正在与FJ玩一个疯狂的游戏.奶牛会排成一行 ...

  2. 洛谷 P3014 [USACO11FEB]牛线Cow Line

    P3014 [USACO11FEB]牛线Cow Line 题目背景 征求翻译.如果你能提供翻译或者题意简述,请直接发讨论,感谢你的贡献. 题目描述 The N (1 <= N <= 20) ...

  3. 洛谷——P2952 [USACO09OPEN]牛线Cow Line

    P2952 [USACO09OPEN]牛线Cow Line 题目描述 Farmer John's N cows (conveniently numbered 1..N) are forming a l ...

  4. 洛谷:P2952 [USACO09OPEN]牛线Cow Line:题解

    题目链接:https://www.luogu.org/problemnew/show/P2952 分析: 这道题非常适合练习deque双端队列,~~既然是是练习的板子题了,建议大家还是练练deque, ...

  5. USACO 2011 February Silver Cow Line /// 康拓展开模板题 oj22713

    题目大意: 输入n k,1-n的排列,k次操作 操作P:输入一个m 输出第m个排列 操作Q:输入一个排列 输出它是第几个排列 Sample Input 5 2P3Q1 2 5 3 4 Sample O ...

  6. 【BZOJ】3301: [USACO2011 Feb] Cow Line(康托展开)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3301 其实这一题很早就a过了,但是那时候看题解写完也是似懂非懂的.... 听zyf神犇说是康托展开, ...

  7. P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold

    P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold我比赛的时候A了,luogu上25分,QAQ,又憨又傻的200+代码,我为什么要干电脑干的事情,无语了.如果左边 ...

  8. P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold 解题报告

    P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold 题意 给一个字符串,每次可以从两边中的一边取一个字符,要求取出的字符串字典序最小 可以Hash+二分 也可以S ...

  9. 编程算法 - 最好牛线(Best Cow Line) 代码(C)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/37909933 最好牛线(Best Cow L ...

随机推荐

  1. Scrum Meeting 10.23

    Scrum Meeting No.3 今天所完成的任务仍然停留在学习基础知识上.说实话,由于缺少安卓开发.web开发的经验,我们只能一步步摸索着来. 成员 已完成任务 下一阶段任务 徐越 阅读网上的博 ...

  2. HDU 3092 Least common multiple 01背包

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3092 Least common multiple Time Limit: 2000/1000 MS ...

  3. ADT图及图的实现及图的应用

    图: 图中涉及的定义: 有向图: 顶点之间的相关连接具有方向性: 无向图: 顶点之间相关连接没有方向性: 完全图: 若G是无向图,则顶点数n和边数e满足:0<=e<=n(n-1)/2,当e ...

  4. 浏览器播放rtmp流

    我是利用flash插件实现的,需要以下几个文件: flowplayer-3.2.8.min.js flowplayer-3.2.18.swf flowplayer.rtmp-3.2.8.swf flo ...

  5. String 类 常用函数

    构造方法摘要: String(byte[] bytes)           通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String. String(char[] value) ...

  6. Java 多生产者消费者问题

    /* 生产者,消费者.   多生产者,多消费者的问题. if判断标记,只有一次,会导致不该运行的线程运行了.出现了数据错误的情况. while判断标记,解决了线程获取执行权后,是否要运行!   not ...

  7. Keil C51 的printf

    转自:http://blog.csdn.net/zhanglianpin/article/details/44779009 在Keil C51 中使用printf ,首先需要重新实现 putchar( ...

  8. 笔记:EF出现列名 'Discriminator' 无效、类没有加入数据库上下文也被数据迁移生成表

    笔记: EF出现列名 'Discriminator' 无效: 类没有加入数据库上下文也被数据迁移生成表: 出现该问题一般是使用了某个基类继承了实体类: 原因是code first的POCO实体对象的继 ...

  9. vue 里面的watch 选项详解

    早就想好好写写这个watch了,一直顾不上,因为想深刻的记录一下,其实这些东西只要是好好看看官网的说明,都在里面呢. 虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器.这就是为什么 V ...

  10. PAT 甲级 1146 Topological Order

    https://pintia.cn/problem-sets/994805342720868352/problems/994805343043829760 This is a problem give ...