题意:

定义一个排列的差分为后一项减前一项之差构成的数列,求对于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. Java 基础 -- BigInteger BigDecimai大数

    BigInteger 加减乘除 BigInteger bi1 = new BigInteger("123456789") ; // 声明BigInteger对象 BigIntege ...

  2. Unity NGUI插件

    前言:关于Unity中关于UI的插件,我们最开始学的是UGUI,是Unity自带的UI系统,而在Unity版本还没更新出UGUI之前,除了NGUI没有一个更好些的插件,所以人们不得不去选择NGUI去制 ...

  3. php-验证码类-PDO类-缩略图类

    Verify.class.php 验证码类 <?php class Verify{ const VERIFY_TYPE_NUM=1; const VERIFY_TYPE_EN=2; const ...

  4. 高级运维(六):源码安装Redis缓存服务、常用Redis数据库操作指令、配置Redis主从服务器

    一.源码安装Redis缓存服务 目标: 本案例要求先快速搭建好一台Redis服务器,并测试该缓存服务器: 1> 设置变量test,值为123 2> 查看变量test的值 3> 设置计 ...

  5. jQuery Validate (摘自官网)

    jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方法,包括 URL 和电子邮件验证 ...

  6. 微信中location.reload失效

    var len = window.location.href.indexOf("?"); if(len>0){     window.location.href=window ...

  7. 制作Lightbox效果

    制作Lightbox效果 Lightbox是网页上常用的一种效果,比如单击网页上某个链接或图片,则整个网页会变暗,并在网页中间弹出一个层来.此时,用户只能在层上进行操作,不能在单击变暗的网页. 程序代 ...

  8. springboot启动失败( No active profile set, falling back to default profiles: default)

    问题: springboot启动失败( No active profile set, falling back to default profiles: default) 解决方法 在pom.xml文 ...

  9. Docker、Kubernetes(k8s)与OpenShift之间的关系

    openshift是基于容器计数搭建的一个云平台.这里的容器技术即包括Docker和Kunbernetes.如下图所示,OPenshift底层以Docker作为容器引擎驱动,以Kubernetes作为 ...

  10. Codeforces 1183A Nearest Interesting Number

    题目链接:http://codeforces.com/problemset/problem/1183/A 题意:求不小于 a 且每位数和能被 4 整除的 最小 n 思路:暴力模拟就好. AC代码: # ...