题面

思路

一眼看过去以为NOI2018的题出出来了= =贼吓人

首先,对于这个难度,我们有一个比较明显的结论:

一个序列的难度,等于这个东西:

$hard=max(\sum_{j=i+1}^n[a_j<a_i])(i=1...n)$

也就是一个元素后面的元素比它小的个数的最大值

证明显然,每轮操作只会把它后面的一个东西放到前面来,证毕

统计难度

我们令$f[i][j]$表示长度为$i$的序列难度为$j$的方案数

这个东西好像不太好算,没法确定难度正好为$j$,那我们做一个前缀和,令$F[i][j]$表示难度小于等于$j$的方案数

这个东西可以用组合意义算出来:

$F[i][j]=(j+1)^(i-j)\ast j!(i\geq j)$

$F[i][j]=i!(i < j)$

下面那个比较显然,上面那个的意义是,从最前面开始放,每次都有令上面那个统计序列难度的那个式子的答案在$[0,j]$区间内任选的$j+1$个选择,选到$n-m$个之后后面的就随便放了

然后,我们用$F$表示$f$:$f[i][j]=F[i][j]-F[i][j-1]$

字典序

对于字典序这里,我们依旧是从前往后逐位确定,每次还是枚举后面有多少个比它小的

不难发现,在确定了一个位置的后面有$m$个比它小的以后,后面的就随便放了,每次的方案数是$F[i][m]$

而当还没有这样的位置时,每次处理区间$[t,n]$等价于把$[1,n-t+1]$中的数放进去并满足条件,方案数为$f[t][m]$

这样确定之后,最后再扫一遍确定每个位置的元素是什么就好了

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
inline ll read(){
ll re=0,flag=1;char ch=getchar();
while(ch>'9'||ch<'0'){
if(ch=='-') flag=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') re=(re<<1)+(re<<3)+ch-'0',ch=getchar();
return re*flag;
}
ll n,m,k;
ll f[50],g[50],fac[50];
ll qpow(ll a,ll b){
ll re=1;
while(b){
if(b&1) re=re*a;
a=a*a;b>>=1;
}
return re;
}
ll rk[50],vis[50];
int main(){
n=read();m=read();k=read();
ll i,j;
fac[0]=1;
for(i=1;i<=n;i++) fac[i]=fac[i-1]*(ll)i;
for(i=0;i<=n;i++) f[i]=((i<m)?fac[i]:(fac[m]*qpow(m+1,i-m)));
for(i=0;i<=n;i++) g[i]=f[i]-((i<(m-1))?fac[i]:(fac[m-1]*qpow(m,i-m+1)));
ll cur,flag=0;
for(i=1;i<=n;i++){
for(j=1;j<=n-i+1;j++){
if(flag||j==m+1) cur=f[n-i];
else cur=g[n-i];
if(cur>=k){
rk[i]=j;
if(j==m+1) flag=1;
break;
}
else k-=cur;
}
}
for(i=1;i<=n;i++){
cur=0;
for(j=1;j<=n;j++){
cur+=(!vis[j]);
if(cur==rk[i]){
printf("%lld ",j);
vis[j]=1;break;
}
}
}
}

冒泡排序 [组合数学+dp]的更多相关文章

  1. 【uoj#22】[UR #1]外星人 组合数学+dp

    题目描述 给你一个长度为 $n$ 的序列 $\{a_i\}$ 和一个数 $x$ ,对于任意一个 $1\sim n$ 的排列 $\{p_i\}$ ,从 $1$ 到 $n$ 依次执行 $x=x\ \tex ...

  2. 【bzoj1925】[Sdoi2010]地精部落 组合数学+dp

    题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi,其中Hi是1到 ...

  3. Codeforces 722E 组合数学 DP

    题意:有一个n * m的棋盘,你初始在点(1, 1),你需要去点(n, m).你初始有s分,在这个棋盘上有k个点,经过一次这个点分数就会变为s / 2(向上取整),问从起点到终点的分数的数学期望是多少 ...

  4. 「题解」:[组合数学][DP]:地精部落

    拿到这道题秒懂题意:波动序列. 然鹅不会打.想了一节课,想打纯组合数学,结果找不到规律. 想的是先假设拍出一个序列,然后交换其中的元素求组合, 无奈没啥规律可循,显然不能一口气求出来(我说的是我没办法 ...

  5. UVALive 7143 Room Assignment(组合数学+DP)(2014 Asia Shanghai Regional Contest)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...

  6. HDU-4532 湫秋系列故事——安排座位 组合数学DP

    题意:有来自n个专业的学生,每个专业分别有ai个同学,现在要将这些学生排成一行,使得相邻的两个学生来自不同的专业,问有多少种不同的安排方案. 分析:首先将所有专业的学生视作一样的,最后再乘以各自学生的 ...

  7. Codeforces 886E Maximum Element 组合数学 + dp

    我们定义dp[ i ]表示长度为 i 的序列, 最后没有一个==k的时候返回的方案数, 也就是最后强制返回 i 的方案数. 我们能得到dp方程   dp[ i ] = sum(dp[ i - j - ...

  8. UVALive 7143 Room Assignment(组合数学+DP)

    题目链接 参考自:http://www.cnblogs.com/oyking/p/4508260.html 题意 n个人,其中有k对双胞胎.现有m间房间,每间房间有容量ci问分配房间的方案数. 分析 ...

  9. BZOJ2281:[SDOI2011]黑白棋(博弈论,组合数学,DP)

    Description 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小 ...

随机推荐

  1. 解决nsis error!cant initialize plug-ins directory.please try again later

    情况1: 调用SectionEnd会释放掉dll初始化标记,所有Section都必须放在函数的最下面. 情况2: 有可能是栈里的数据错乱,特别注意的是,使用BgWorker.dll获取多线程能力的时候 ...

  2. 【模板时间】◆模板·I◆ 倍增计算LCA

    [模板·I]LCA(倍增版) 既然是一篇重点在于介绍.分析一个模板的Blog,作者将主要分析其原理,可能会比较无趣……(提供C++模板) 另外,给reader们介绍另外一篇非常不错的Blog(我就是从 ...

  3. js中document的用法小结

    document常用属性: document.title//设置文档标题,与HTNL中的title标签等价 document.bgColor//设置页面背景颜色 document.fgColor//设 ...

  4. SpringBoot注入Mapper提示Could not autowire. No beans of 'xxxMapper' type found错误

    通过用Mabatis的逆向工程生成的Entity和Mapper.在Service层注入的时候一直提示Could not autowire. No beans of 'xxxMapper' type f ...

  5. InteliJ IDEA 设置eclipse快捷键

    从使用eclipse切换到intellij idea开发工具常常会伴随这快捷切换的困扰,今天写到将intellij idea快捷键设置为eclipse快捷的方式 步骤如下: file -> se ...

  6. php-5.6.26源代码 - opcode处理器,“函数调用opcode”处理器,如何调用扩展模块的函数

    // opcode处理器 --- ZEND_DO_FCALL_SPEC_CONST_HANDLER实现在 php-5.6.26\Zend\zend_vm_execute.h static int ZE ...

  7. <Docker学习>3. docker镜像命令使用

    镜像提供容器运行时所需要的程序,资源.配置文件等,是一个特殊的文件系统.是容器运行的基础.镜像是多层文件系统组成的,是一个分层存储的架构,在镜像的构建中,会一层层的构建,每一层构建完成就不会发生改变, ...

  8. Dropping Balls(小球下落)

    紫书P148,例题6-6 Sample Input 4 2 3 4 10 1 2 2 8 128 Sample Output 12 7 512 3 255 这应该不仅仅是一棵完全二叉树,题目中说保证所 ...

  9. SAP(ABAP):STOP,EXIT,CHECK,RETURN,REJECT,CONTINUE

    Stop 命令使用该命令的程序位置INITIALIZATION, AT SELECTION-SCREEN, START-OF-SELECTION和GET 事件中处理说明1. 当在INITIALIZAT ...

  10. 笔记-python-standard library-16.3 time

    笔记-python-standard library-16.3 time 1.      time 1.1.    开始 time模块中时间表现的格式主要有三种: timestamp时间戳,时间戳表示 ...