P3014 [USACO11FEB]牛线Cow Line && 康托展开
康托展开
康托展开为全排列到一个自然数的映射, 空间压缩效率很高。
简单来说, 康托展开就是一个全排列在所有此序列全排列字典序中的第 \(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 && 康托展开的更多相关文章
- [洛谷P3014][USACO11FEB]牛线Cow Line (康托展开)(数论)
如果在阅读本文之前对于康托展开没有了解的同学请戳一下这里: 简陋的博客 百度百科 题目描述 N(1<=N<=20)头牛,编号为1...N,正在与FJ玩一个疯狂的游戏.奶牛会排成一行 ...
- 洛谷 P3014 [USACO11FEB]牛线Cow Line
P3014 [USACO11FEB]牛线Cow Line 题目背景 征求翻译.如果你能提供翻译或者题意简述,请直接发讨论,感谢你的贡献. 题目描述 The N (1 <= N <= 20) ...
- 洛谷——P2952 [USACO09OPEN]牛线Cow Line
P2952 [USACO09OPEN]牛线Cow Line 题目描述 Farmer John's N cows (conveniently numbered 1..N) are forming a l ...
- 洛谷:P2952 [USACO09OPEN]牛线Cow Line:题解
题目链接:https://www.luogu.org/problemnew/show/P2952 分析: 这道题非常适合练习deque双端队列,~~既然是是练习的板子题了,建议大家还是练练deque, ...
- 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 ...
- 【BZOJ】3301: [USACO2011 Feb] Cow Line(康托展开)
http://www.lydsy.com/JudgeOnline/problem.php?id=3301 其实这一题很早就a过了,但是那时候看题解写完也是似懂非懂的.... 听zyf神犇说是康托展开, ...
- P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold
P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold我比赛的时候A了,luogu上25分,QAQ,又憨又傻的200+代码,我为什么要干电脑干的事情,无语了.如果左边 ...
- P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold 解题报告
P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold 题意 给一个字符串,每次可以从两边中的一边取一个字符,要求取出的字符串字典序最小 可以Hash+二分 也可以S ...
- 编程算法 - 最好牛线(Best Cow Line) 代码(C)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/37909933 最好牛线(Best Cow L ...
随机推荐
- Scrum Meeting 10.23
Scrum Meeting No.3 今天所完成的任务仍然停留在学习基础知识上.说实话,由于缺少安卓开发.web开发的经验,我们只能一步步摸索着来. 成员 已完成任务 下一阶段任务 徐越 阅读网上的博 ...
- HDU 3092 Least common multiple 01背包
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3092 Least common multiple Time Limit: 2000/1000 MS ...
- ADT图及图的实现及图的应用
图: 图中涉及的定义: 有向图: 顶点之间的相关连接具有方向性: 无向图: 顶点之间相关连接没有方向性: 完全图: 若G是无向图,则顶点数n和边数e满足:0<=e<=n(n-1)/2,当e ...
- 浏览器播放rtmp流
我是利用flash插件实现的,需要以下几个文件: flowplayer-3.2.8.min.js flowplayer-3.2.18.swf flowplayer.rtmp-3.2.8.swf flo ...
- String 类 常用函数
构造方法摘要: String(byte[] bytes) 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String. String(char[] value) ...
- Java 多生产者消费者问题
/* 生产者,消费者. 多生产者,多消费者的问题. if判断标记,只有一次,会导致不该运行的线程运行了.出现了数据错误的情况. while判断标记,解决了线程获取执行权后,是否要运行! not ...
- Keil C51 的printf
转自:http://blog.csdn.net/zhanglianpin/article/details/44779009 在Keil C51 中使用printf ,首先需要重新实现 putchar( ...
- 笔记:EF出现列名 'Discriminator' 无效、类没有加入数据库上下文也被数据迁移生成表
笔记: EF出现列名 'Discriminator' 无效: 类没有加入数据库上下文也被数据迁移生成表: 出现该问题一般是使用了某个基类继承了实体类: 原因是code first的POCO实体对象的继 ...
- vue 里面的watch 选项详解
早就想好好写写这个watch了,一直顾不上,因为想深刻的记录一下,其实这些东西只要是好好看看官网的说明,都在里面呢. 虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器.这就是为什么 V ...
- PAT 甲级 1146 Topological Order
https://pintia.cn/problem-sets/994805342720868352/problems/994805343043829760 This is a problem give ...