BUPT2017 wintertraining(15) #6C

题意

给长度n的数列,1,2,..,n,按依次递增递减排序,求字典序第k小的排列。

题解

dp。

up[i][j]表示长度为j,以第i小开头前两个递增的排列有几种。

down[i][j]表示长度为j,以第i小开头前两个递减的排列有几种。

那么有\(down[i][j]=\sum_{k=1}^{k=j-1}up[k][j-1]\)

并且有\(down[1][1]=1\),\(up[i][j]=down[j-i+1][j]\)。

然后就可以递推了。

求第k小的排列,令s[i]=i(i=1,2,…n),再令i为n到1,从小到大枚举未用过的i个数中第v小的,如果down[v][i]不比k小,说明后面是以第v小开头的长为i的开头递减排列,之后就要找这些排列中第k-down小的了。或判断up,根据标记的fup(表示之前是上升否)。输出s[v],并移除s[v]。

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#define N 21
#define ll long long
using namespace std;
int t,n;
ll k;
ll up[N][N],down[N][N];
int s[N];
void get(){
int fup,v=0;
for(int i=1;i<=n;i++)s[i]=i;
for(int i=n;i;i--){//剩下i个位置要放
if(i==n){
for(int j=1;j<=n;j++){//放第1小到第n小
if(k<=down[j][i]){//先考虑下降,因为下降则这个方案更小
v=j;fup=0;break;//s[j]开头的够算,且是之后一个是上升
}
k-=down[j][i];//不够算,则找后面的第k-down大的方案。
if(k<=up[j][i]){
v=j;fup=1;break;
}
k-=up[j][i];
}
}else{
if(fup){
for(int j=v;j<=i;j++){
if(k<=down[j][i]){
v=j;break;
}
k-=down[j][i];
}
}else{
for(int j=1;j<v;j++){
if(k<=up[j][i]){
v=j;break;
}
k-=up[j][i];
}
}
fup^=1;
}
printf("%d ",s[v]);
for(int j=v;j<i;j++)s[j]=s[j+1];
}
puts("");
}
int main() {
down[1][1]=1;
for(int i=1;i<N;i++){
for(int j=2;j<=i;j++)
down[j][i]=down[j-1][i]+up[j-1][i-1];
//以第j小开头长度i的下降=sum_{k=1}^{k=j-1}{up[k][i-1]}
//那么down[j][i]-down[j-1][i]=up[j-1][i-1]
for(int j=1;j<=i;j++)
up[j][i]=down[i-j+1][i];
//第j小开头的上升=第i-j+1大开头的下降
}
scanf("%d",&t);
while(t--){
scanf("%d%lld",&n,&k);
get();
}
return 0;
}

【POJ1037】A decorative fence(DP)的更多相关文章

  1. 【BZOJ4712】洪水(动态dp)

    [BZOJ4712]洪水(动态dp) 题面 BZOJ 然而是权限题QwQ,所以粘过来算了. Description 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开 ...

  2. 【BZOJ3387】[Usaco2004 Dec]Fence Obstacle Course栅栏行动 线段树

    [BZOJ3387][Usaco2004 Dec]Fence Obstacle Course栅栏行动 Description 约翰建造了N(1≤N≤50000)个栅栏来与牛同乐.第i个栅栏的z坐标为[ ...

  3. 【CF484E】Sign on Fence(主席树)

    [CF484E]Sign on Fence(主席树) 题面 懒得贴CF了,你们自己都找得到 洛谷 题解 这不就是[TJOI&HEOI 排序]那题的套路吗... 二分一个答案,把大于答案的都变成 ...

  4. 【题解】Jury Compromise(链表+DP)

    [题解]Jury Compromise(链表+DP) 传送门 题目大意 给你\(n\le 200\)个元素,一个元素有两个特征值,\(c_i\)和\(d_i\),\(c,d \in [0,20]\), ...

  5. 【题解】Making The Grade(DP+结论)

    [题解]Making The Grade(DP+结论) VJ:Making the Grade HNOI-D2-T3 原题,禁赛三年. 或许是我做过的最简单的DP题了吧(一遍过是什么东西) 之前做过关 ...

  6. 【题解】NOIP2017逛公园(DP)

    [题解]NOIP2017逛公园(DP) 第一次交挂了27分...我是不是必将惨败了... 考虑这样一种做法,设\(d_i\)表示从该节点到n​节点的最短路径,\(dp(i,k)\)表示从\(i\)节点 ...

  7. 【题解】284E. Coin Troubles(dp+图论建模)

    [题解]284E. Coin Troubles(dp+图论建模) 题意就是要你跑一个完全背包,但是要求背包的方案中有个数相对大小的限制 考虑一个\(c_i<c_j\)的限制,就是一个\(c_i\ ...

  8. 【CF917D】Stranger Trees 树形DP+Prufer序列

    [CF917D]Stranger Trees 题意:给你一棵n个点的树,对于k=1...n,问你有多少有标号的n个点的树,与给出的树有恰好k条边相同? $n\le 100$ 题解:我们先考虑容斥,求出 ...

  9. 【CF840C】On the Bench DP

    [CF840C]On the Bench 题意:给你一个长度为n的数组{ai},定义一个1到n的排列是合法的,当且仅当对于$1\le i <n$,$a_i\times a_{i+1}$不是完全平 ...

随机推荐

  1. C#复习笔记(3)--C#2:解决C#1的问题(进入快速通道的委托)

    委托 前言:C#1中就已经有了委托的概念,但是其繁杂的用法并没有引起开发者太多的关注,在C#2中,进行了一些编译器上的优化,可以用匿名方法来创建一个委托.同时,还支持的方法组和委托的转换.顺便的,C# ...

  2. spring 给一个类 生成test

    右击一个类,然后:GoTo==>test ,就可以新建这个类的测试用例了,简单粗暴, 如果想要不污染数据库,就在一个测试用例 的标签@Test 下面在加上@RollBack 这样: @Test ...

  3. Chromecast

    Chromecast chrome://cast/#offers https://chromecast.com/help https://www.pcmag.com/feature/326584/24 ...

  4. RN 实战 & React Native 实战

    RN 实战 & React Native 实战 https://abc.xgqfrms.xyz/react-native-docs/ 0.59 https://github.com/xgqfr ...

  5. AVL树,红黑树

    AVL树 https://baike.baidu.com/item/AVL%E6%A0%91/10986648 在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高 ...

  6. Hibernate最佳实战

    1:一对一,一对多,多对多双向管理必设mappedBy ,将关系交给乙方维护,不然的话会在双方都建立关系,比如一对一双向的时候双方都会保存对方的id外键管理 具体在项目中采用双向还是单项看实际情况. ...

  7. Nginx简单的负载均衡入门

    nginx是用来管理tomcat的,只管理tomcat,并没有管理具体tomcat里面的项目,这里实现了简单的nginx管理两个tomcat的配置,注意upstream节点应该配置到service节点 ...

  8. How to remove unwant Explorer Context Menu

    HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell

  9. CSS3 flexbox 布局 ---- flex 容器属性介绍

    flexbox布局是CSS3中新增的属性,它可以很轻松地帮我们解决掉一些常见的布局问题,比如导航栏. 我们用普通的方法写导航栏,通常会在ul, li 结构写好后,让li 元素左浮动,然后再给ul 清浮 ...

  10. luogu P1816 【忠诚】

    话说许多dalao都采取线段树A题可本蒟蒻不会啊, 暴力的我想出了暴力解法(快排) #include<cstdio> #include<algorithm> using nam ...