hdu多校第五场1005 (hdu6628) permutation 1 排列/康托展开/暴力
题意:
定义一个排列的差分为后一项减前一项之差构成的数列,求对于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 排列/康托展开/暴力的更多相关文章
- 2014 HDU多校弟五场J题 【矩阵乘积】
题意很简单,就是两个大矩阵相乘,然后求乘积. 用 Strassen算法 的话,当N的规模达到100左右就会StackOverFlow了 况且输入的数据范围可达到800,如果变量还不用全局变量的话连内存 ...
- 2014 HDU多校弟五场A题 【归并排序求逆序对】
这题是2Y,第一次WA贡献给了没有long long 的答案QAQ 题意不难理解,解题方法不难. 先用归并排序求出原串中逆序对的个数然后拿来减去k即可,如果答案小于0,则取0 学习了归并排序求逆序对的 ...
- hdu多校第六场1005 (hdu6638) Snowy Smilel 线段树/区间最大和
题意: 给定一个矩阵,矩阵上有若干点,每个点有正或负的权值,找一个方框框住一些点使得方框中点权值最大. 题解: 离散化横纵坐标,容易将这个问题转化为在矩阵上求最大和子矩阵的问题. 普通的n*n的矩阵的 ...
- hdu多校第五场1002 (hdu6625) three arrays 字典树/dfs
题意: 给你两个序列a,b,序列c的某位是由序列a,b的此位异或得来,让你重排序列ab,找出字典序最小的序列c. 题解: 如果能找到a,b序列中完全一样的值当然最好,要是找不到,那也尽量让低位不一样. ...
- hdu多校第五场1004 (hdu6627) equation 1 计算几何
题意: 给你一个C,再给你n组a,b,让你求x取什么值的时候,$ \sum_{i=1}^n |a_i*x+b_i| =C $,要求求出解的个数,并用最简分数从小到大表示,如果有无穷多解,输出-1. 题 ...
- hdu多校第五场1006 (hdu6629) string matching Ex-KMP
题意: 给你一个暴力匹配字符串公共前缀后缀的程序,为你对于某个字符串,暴力匹配的次数是多少. 题解: 使用扩展kmp构造extend数组,在扩展kmp中,设原串S和模式串T. extend[i]表示T ...
- hdu多校第五场1007 (hdu6630) permutation 2 dp
题意: 给你n个数,求如下限制条件下的排列数:1,第一位必须是x,2,最后一位必须是y,3,相邻两位之差小于等于2 题解: 如果x<y,那么考虑把整个数列翻转过来,减少讨论分支. 设dp[n]为 ...
- 2018 HDU多校第四场赛后补题
2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...
- 2018 HDU多校第三场赛后补题
2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...
随机推荐
- Spring boot自定义拦截器和拦截器重定向配置简单介绍
大家好: 本文简单介绍一下用于权限控制的Spring boot拦截器配置,拦截器重定向问题. 开发工具:jdk1.8 idea2017(付费版,网上找的破解教程) 1,首先使用idea创建一个Sp ...
- Yii2的一些问题
Yii2中删除能不能串着用 Yii2中find.findAll有什么区别 Yii2中User::findOne($id)和User::find->where(['id'=>1])-> ...
- The method setPositiveButton(int, DialogInterface.OnClickListener) in the type AlertDialog.Builder i
参考资料: http://blog.csdn.net/competerh_programing/article/details/7377950 在创建Dialog的时候,出现: The method ...
- ASP.NET Core学习——2
Application Startup ASP.NET Core为应用程序提供了处理每个请求的完整控制.Startup类是应用程程的入口(entry point),这个类可以设置配置(configur ...
- CSS:CSS 分组 和 嵌套 选择器
ylbtech-CSS:CSS 分组 和 嵌套 选择器 1.返回顶部 1. CSS 分组 和 嵌套 选择器 Grouping Selectors 在样式表中有很多具有相同样式的元素. h1 { col ...
- RabbitMQ 交换器、持久化
一. 交换器 RabbitMQ交换器(Exchange)分为四种 direct fanout topic headers direct 默认的交换器类型,消息的RoutingKey与队列的bindi ...
- Delphi多线程详解
(整理自网络) Delphi多线程处理 1-1多线程的基本概念 WIN 98/NT/2000/XP 是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU 运行时间和资源,或者 ...
- C++——异常
1.throw表达式 if (item1.isbn()!=item2.isbn()) throw runtime_error("data must refer to the same ISB ...
- CSS margin属性
例子: p{ margin:2cm 4cm 3cm 4cm; } 结果如下: margin-top是上外边距 margin-right是右外边距 margin-bottom是下外边距 margin-l ...
- 7. Jmeter-逻辑控制器介绍与使用
逻辑控制器介绍与使用 如果(if)控制器 事物控制器 循环控制器 while controller critical section controller foreach控制器 include con ...