题意:

定义一个排列的差分为后一项减前一项之差构成的数列,求对于n个数的排列,差分的字典序第k小的那个,n<=20,k<=1e4。

题解:

暴力打表找一遍规律,会发现,对于n个数的排列,如果想找到差分的字典序第k小的,如果k<=(n-1)!,那么对应的那个排列就是把第一位赋值为n,后面的是1~n-1的元素本身排列字典序第k小的。

比如,4个元素的排列的差分字典序最小的前6个分别是

4,1,2,3

4,1,3,2

4,2,1,3

4,2,3,1

4,3,1,2

4,3,2,1

当n为10或更多的时候,(n-1)!>1e4,便可用康托逆展开直接计算。

当n为9以下时,原先的想法是在本地暴力排序,对于每个n都取前1e4个元素交表。后来发现hdu限制提交代码大小,分析了一下,9!约等于3e5,暴力打表,过了。

#include<iostream>
#include<vector>
#include<algorithm>
#define LL long long
using namespace std;
int MAXN;
LL fact[];
int tmp[];
struct Node{
int px[];//排列
int cha[];//排列的差分
int indexpx;
int indexcha;
friend bool operator > (const Node &a,const Node &b){
for(int i=;i<MAXN;i++){
if(a.cha[i]!=b.cha[i])return a.cha[i]>b.cha[i];
}
}
friend bool operator < (const Node &a,const Node &b){
for(int i=;i<MAXN;i++){
if(a.cha[i]!=b.cha[i])return a.cha[i]<b.cha[i];
}
}
//比较差分的字典序
}node[];
int ans[][];
void make_ans(){
for(int i=;i<=MAXN;i++){
node[].px[i]=i;
node[].cha[i-]=;
}
node[].indexpx=;
int i,n;
for(i=;;i++){
for(int j=;j<=MAXN;j++){
node[i].px[j]=node[i-].px[j];
}
if(!next_permutation(&node[i].px[],&node[i].px[MAXN+])){
n=i-;
break;
} for(int j=;j<MAXN;j++){
node[i].cha[j]=node[i].px[j+]-node[i].px[j];
} node[i].indexpx=i;
}
sort(node+,node++n);
for(int i=;i<=min(n,);i++){
ans[MAXN][i]=node[i].indexpx;
}
//暴力打表预处理
}
void make_fact(){
fact[]=;
for(int i=;i<=;i++){
fact[i]=fact[i-]*i;
}
}
void Cantor_invexp(int *p,int len,LL rank){
//康托逆展开
int temp[len];
for(int i=;i<len;i++){
temp[i]=i+;
}
for(int i=;i<=len;i++){
int a=rank/fact[len-i];
rank%=fact[len-i];
for(int j=;j<len;j++){
if(a== && temp[j]>){
p[i]=temp[j];
temp[j]=;
break;
}else if(temp[j]>){
a--;
}
}
}
return ;
} int main(){
make_fact();
for(int i=;i<=;i++){
MAXN=i;
make_ans();
} // return 0;
int t;
scanf("%d",&t);
while(t--){
int n,k;
scanf("%d %d",&n,&k);
if(n>=){
printf("%d",n);
Cantor_invexp(tmp,n-,1LL*k-);
for(int i=;i<=n-;i++){
printf(" %d",tmp[i]);
}
printf("\n");
}else{
Cantor_invexp(tmp,n,1LL*ans[n][k]-);
for(int i=;i<=n;i++){
printf("%d",tmp[i]);
if(i<n)printf(" ");
else printf("\n");
}
}
}
return ;
}

hdu多校第五场1005 (hdu6628) permutation 1 排列/康托展开/暴力的更多相关文章

  1. 2014 HDU多校弟五场J题 【矩阵乘积】

    题意很简单,就是两个大矩阵相乘,然后求乘积. 用 Strassen算法 的话,当N的规模达到100左右就会StackOverFlow了 况且输入的数据范围可达到800,如果变量还不用全局变量的话连内存 ...

  2. 2014 HDU多校弟五场A题 【归并排序求逆序对】

    这题是2Y,第一次WA贡献给了没有long long 的答案QAQ 题意不难理解,解题方法不难. 先用归并排序求出原串中逆序对的个数然后拿来减去k即可,如果答案小于0,则取0 学习了归并排序求逆序对的 ...

  3. hdu多校第六场1005 (hdu6638) Snowy Smilel 线段树/区间最大和

    题意: 给定一个矩阵,矩阵上有若干点,每个点有正或负的权值,找一个方框框住一些点使得方框中点权值最大. 题解: 离散化横纵坐标,容易将这个问题转化为在矩阵上求最大和子矩阵的问题. 普通的n*n的矩阵的 ...

  4. hdu多校第五场1002 (hdu6625) three arrays 字典树/dfs

    题意: 给你两个序列a,b,序列c的某位是由序列a,b的此位异或得来,让你重排序列ab,找出字典序最小的序列c. 题解: 如果能找到a,b序列中完全一样的值当然最好,要是找不到,那也尽量让低位不一样. ...

  5. hdu多校第五场1004 (hdu6627) equation 1 计算几何

    题意: 给你一个C,再给你n组a,b,让你求x取什么值的时候,$ \sum_{i=1}^n |a_i*x+b_i| =C $,要求求出解的个数,并用最简分数从小到大表示,如果有无穷多解,输出-1. 题 ...

  6. hdu多校第五场1006 (hdu6629) string matching Ex-KMP

    题意: 给你一个暴力匹配字符串公共前缀后缀的程序,为你对于某个字符串,暴力匹配的次数是多少. 题解: 使用扩展kmp构造extend数组,在扩展kmp中,设原串S和模式串T. extend[i]表示T ...

  7. hdu多校第五场1007 (hdu6630) permutation 2 dp

    题意: 给你n个数,求如下限制条件下的排列数:1,第一位必须是x,2,最后一位必须是y,3,相邻两位之差小于等于2 题解: 如果x<y,那么考虑把整个数列翻转过来,减少讨论分支. 设dp[n]为 ...

  8. 2018 HDU多校第四场赛后补题

    2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...

  9. 2018 HDU多校第三场赛后补题

    2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...

随机推荐

  1. 127.0.0.1和localhost不能正确映射的问题

    可能引起的问题: 检查:分别ping一下127.0.0.1和localhost 以上是正确演示,不匹配的话,ping localhost会返回: 解决方案: 可能1: 在浏览器中打开http://12 ...

  2. php 实现的功能

    1.php写日志函数 (如:前端请求日志记录) : https://www.cnblogs.com/lvchenfeng/p/6794822.html 2.php中(服务器)使用CURL实现GET和P ...

  3. LInux文件基础知识和文件目录操作(二)文件I/O操作

    1.文件I/O操作分为两部分来讲解: 第一部分是非缓冲文件操作,这种操作适合于比较小规模文件的读写和对实时性要求很高的设备的数据通信,这类操作是系统调用提供的: 第二部分是缓冲文件操作,所面向的则是大 ...

  4. java 原生 HttpClient

    package org.rx.socks.http; import com.google.common.base.Strings; import lombok.SneakyThrows; import ...

  5. python 生成json格式文件,并存储到手机上

    上代码 #!/usr/bin/env python # -*- encoding: utf-8 -*- import json import os import random "" ...

  6. java.lang.Object错误

    java.lang.Object错误 项目遇到一个错误 因为构建路径不完整..... 主要是因为缺少JDK(java.lang.Object来自那里),或者是JDK错误. 右击项目-->属性-- ...

  7. jeecg随笔 -- 实体关联属性的设计

    转载:https://www.iteye.com/blog/1868620 在jeecg 里 ,是根据数据库生成实体的,很多关联关系需要自己进行进一步整理才能满足我们的业务需求 例如外键关系 由于很多 ...

  8. 内存Zone中的pageset成员分析

    1: struct per_cpu_pageset __percpu *pageset; 首先,分析一个函数,__free_pages,这个函数是Buddy System提供的API接口函数,用于翻译 ...

  9. 序列化之 TLV

    目录 序列化之 TLV 1. 紧凑模式 2. 可扩展性 3. 更好的可扩展性 4. 自解释性 5. 跨语言特性 6. 代码自动化:IDL语言 7. 总结 序列化之 TLV 通信协议可以理解两个节点之间 ...

  10. Java 序列化和反序列化(三)Serializable 源码分析 - 2

    目录 Java 序列化和反序列化(三)Serializable 源码分析 - 2 1. ObjectStreamField 1.1 数据结构 1.2 构造函数 2. ObjectStreamClass ...