康托展开

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

简单来说, 康托展开就是一个全排列在所有此序列全排列字典序中的第 \(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. 王者荣耀交流协会final发布第五次scrum例会

    1.例会照片 成员高远博,冉华,王磊,王玉玲,任思佳,袁玥,王磊,王超. master:王磊 2.时间跨度 2017年12月5日 18:00 — 18:21,总计21分钟 3.地点 一食堂二楼沙发座椅 ...

  2. mybatis oracle和mysql like模糊查询写法

    oracle:RESOURCE_NAME LIKE '%' || #{resourceName} || '%'mysql:RESOURCE_NAME like concat(concat(" ...

  3. 2-Third Scrum Meeting-20151203

    任务安排 闫昊: 今日完成:请假.(编译+计组,压力有点大) 明日任务:设计本地数据库. 唐彬: 今日完成:请假.(编译+计组,压力有点大) 明日任务:阅读ios客户端代码. 史烨轩: 今日完成:请假 ...

  4. JAVA对象的初始化过程

    出处:http://blog.csdn.net/andrew323/article/details/4665379 下面我们通过两个例题来说明对象的实例化过程. 例1:   编译并运行该程序会有以下输 ...

  5. BETA-1

    前言 我们居然又冲刺了·一 团队代码管理github 站立会议 队名:PMS 530雨勤(组长) 过去两天完成了哪些任务 发现之前的代码居然已经有了陌生感,默默地复习一遍并做注释 阅读关于基于视频的车 ...

  6. js汉字按字母排序

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  7. RHEL/Centos下Sendmail服务器搭建

    目的 Linux下配置Sendmail服务器,并通过客户端验证. 环境 Cento6 局域网(可访问互联网) 内容 配置Sendmail服务器,使得客户端能够通过foxmail或者outlook ex ...

  8. Android 去掉标题全屏显示

    自己测试时出现无法实现去掉标题和全屏功能.最后发现只要public class SocketActivity extends Activity {} 而不能用ActionBarActivity. 先介 ...

  9. pixi.js 总结

    我的博客简单简洁 可能表达不清. 如有想法, 敬请留言.谢谢! 群:881784250 https://github.com/ccaleb/endless-runner/tree/master/jav ...

  10. 程序集里包含多个版本dll引用 ,强制低版本到制定版本dll引用

    在 config 的 <configuration> 节点内加入以下 类似信息 以下是以Newtonsoft.Json 为例子 <runtime> <assemblyBi ...