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 ...
随机推荐
- Daily Scrum (2015/10/21)
今天可以说是项目正式开始的第一天,由于大家缺乏做团队项目的经验,对TFS的使用都还不太熟悉,所以今天大家的主要工作是熟悉TFS的使用和对代码进行初步的理解.我们预计需要2-3天时间来理解透彻源代码.以 ...
- ME.kkkK
ME.kkkK 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 50 40 • Estima ...
- Merge join、Hash join、Nested loop join对比分析
简介 我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge Join,Hash Join ...
- Scapy 网段中ping扫描
安装scapy pip3 install scapy-python3 交互式ip包构造 #scapy >>> ping = sr(IP(dst='202.100.1.1')/ICMP ...
- Failed to execute request because the App-Domain could not be created. Error: 0x8007000e 存储空间不足,无法完成此操作。
今天业务发现,服务器上的网站无法访问了. 页面报错: Server Application UnavailableThe web application you are attempting to a ...
- 《软件工程和Python》PYTHON效能分析和Django
资料汇总网站:http://www.yzhiliao.com/my/course/55 一..作业下面两个题目任选一题: (1)运用jieba库分词(或者你喜欢的其他库),并把代码发到git上去(不发 ...
- LeetCode题解:(114) Flatten Binary Tree to Linked List
题目说明 Given a binary tree, flatten it to a linked list in-place. For example, Given 1 / \ 2 5 / \ \ 3 ...
- java如何写入txt文件
public class TxtWrite { public static void main(String args[]){ contentToTxt("D:\\xyky.txt" ...
- scrapy 直接在编辑器运行
# *_*coding:utf-8 *_* from scrapy.cmdline import execute execute("scrapy crawl spbeen --nolog&q ...
- C++的继承与多态
◆ 概念介绍 继承:为了代码的重用,保留基类的原本结构,并新增派生类的部分,同时可能覆盖(overide)基类的某些成员. 多态:一种将不同的特殊行为和单个泛化记号相关联的能力,分为静态多态和动态多态 ...