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 ...
随机推荐
- 实验三:敏捷开发与XP实践
Java实验三报告 一. 实验内容 (一)敏捷开发与XP 内容:1.敏捷开发(Agile Development)是一种以人为核心.迭代.循序渐进的开发方法. 2.极限编程(eXtreme Pro ...
- alpha版postmortem 报告
一.团队开发存在的问题 此次会议我们团队中每个成员都仔细思考并提出了团队在这一阶段存在的问题,主要如下: 1.前期任务规划.分配不合适: 2.个人对认领任务模块完成度.了解度不够: 3.个人学习意识. ...
- 作业45//Calculator::3.0
计算器 github 我的天我到底要写什么 一,2.0及2.6的改动 做了计算部分 加入了判断输入是否合法 合法的定义是算式符合`数字+运算符+数字+运算符+数字`的格式 其中`"-&quo ...
- 复杂PC问题——信号量与共享存储区
#include <stdio.h> #include <unistd.h> #include <sys/ipc.h> #include <sys/sem.h ...
- printf in KEIL C51
转自:http://blog.csdn.net/it1988888/article/details/8821713 在keil中printf默认是向串口中发送数据的,所以,如果应用该函数,必须先初始化 ...
- poi读取Excel文件和图片
首先得说一下,Excel文件是有03版和07版的区别的,也就是.xls和.xlsx,这两个文件需要分开读取. 其它的废话就不说了,直接贴代码: package util; import java.io ...
- 爬虫学习之-requests乱码
总体功能的一个演示 import requests response = requests.get("https://www.baidu.com") print(type(resp ...
- SQL中字符串截取、连接、替换等函数的用法
一.SQL中SUBSTRING函数的用法1.功能:返回字符.二进制.文本或图像表达式的一部分2.语法:SUBSTRING ( expression, start, length )3.QL 中的 su ...
- spring 整合 Struts1.X [转]
这篇博客摘自[http://blog.csdn.net/chendc201/article/details/8464008], 其中也有一些是自己增加的部分 . 第一步, 需要为 Struts 装载 ...
- 解决多进程中APScheduler重复运行的问题
转自:http://blog.csdn.net/raptor/article/details/69218271 问题 在一个Python web应用中需要定时执行一些任务,所以用了APSchedule ...