Longest Increasing Subsequences

题目连接:

https://www.codechef.com/SNCKPA16/problems/MAKELIS

Description

大厨最近了解了经典的最长上升子序列问题。然而,大厨发现,虽然最长上升子序列的长度

是唯一的,但子序列本身却不一定唯一。比如,序列 [1, 3, 2, 4] 的最长上升子序列有两个:[1, 3, 4]

和 [1, 2, 4]。

大厨在这个方向上多做了些研究,然后提出了下面的这个问题:

给定 K,输出一个整数 N 以及一个 1 ∼ N 的排列,使得这一排列包含恰好 K 个最长上升子

序列。大厨要求 1 ≤ N ≤ 100,不然问题就太简单了。

如果有多种可能的答案,输出任意一种即可。

Input

输入的第一行包含一个整数 T,表示测试数据的组数。接下来是 T 组数据。

每组数据仅有一行,包含一个整数 K。

Output

对于每组数据,输出两行。第一行包含一个整数 N,第二行包含 N 个整数,即 1 ∼ N 的一个

排列,以空格分隔。

• 1 ≤ T ≤ 2 · 104

• 1 ≤ K ≤ 105

Sample Input

2

1

2

Sample Output

5

1 2 3 4 5

4

1 3 2 4

Hint

题意

题解:

很有趣的题,一般来说第一想法是分解质因数,变成乘积的形式,我不知道这样搞不搞得出来,很麻烦的样子……

这道题的正确套路是分解进制,考虑你现在是用m进制去处理这个k,你可以得到b[0]b[1]b[2]这个玩意儿,表示这个m进制的每一位是啥

你现在做出来了b0,那么你就在b[0]前面扔m个小的倒叙的,然后再后面扔一个最小的,再倒叙扔b[1]个倒叙的

这样你就得到了mb[0]+b[1]了,然后一直递归下去,你就构造出来了m进制的

经过计算,发现m=6的时候,恰好能够构造出来,所以就做出来了~

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
int k;
int pri[maxn];
vector<int>p;
void init()
{
for(int i=2;i<maxn;i++)
{
if(pri[i]==0)
{
for(int j=i+i;j<maxn;j+=i)
pri[j]=1;
}
}
}
int cnt[maxn],tot=0;
int solve()
{
scanf("%d",&k);
if(k==1)
{
cout<<"1"<<endl;
cout<<"1"<<endl;
return 1;
}
if(k==2)
{
cout<<"2"<<endl;
cout<<"2 1"<<endl;
return 2;
}
p.clear();
tot=0;
while(k)
{
cnt[tot++]=k%6;
k/=6;
}
reverse(cnt+0,cnt+tot);
for(int i=cnt[0];i;i--)
p.push_back(i);
for(int i=1;i<tot;i++)
{
if(cnt[i]==0){
for(int j=0;j<p.size();j++)
p[j]+=6;
reverse(p.begin(),p.end());
for(int j=1;j<=6;j++)
p.push_back(j);
reverse(p.begin(),p.end());
continue;
} for(int j=0;j<p.size();j++)p[j]+=6;
reverse(p.begin(),p.end());
for(int j=1;j<=6;j++)
p.push_back(j);
reverse(p.begin(),p.end()); for(int j=0;j<p.size();j++)p[j]+=(cnt[i]+i);
for(int j=1;j<=i;j++)p.push_back(j);
for(int j=cnt[i]+i;j>i;j--)
p.push_back(j); }
cout<<p.size()<<endl;
for(int i=0;i<p.size();i++)
cout<<p[i]<<" ";
cout<<endl;
return p.size();
}
int main()
{
init();
int t;
scanf("%d",&t);
while(t--)
solve();
}

SnackDown Longest Increasing Subsequences 构造题的更多相关文章

  1. Longest Increasing Subsequences(最长递增子序列)的两种DP实现

    一.本文内容 最长递增子序列的两种动态规划算法实现,O(n^2)及O(nlogn).     二.问题描述 最长递增子序列:给定一个序列,从该序列找出最长的 升序/递增 子序列. 特点:1.子序列不要 ...

  2. 【二分】【动态规划】Gym - 101156E - Longest Increasing Subsequences

    求最长上升子序列方案数. 转载自:http://blog.csdn.net/u013445530/article/details/47958617,如造成不便,请博主联系我. 数组A包含N个整数(可能 ...

  3. 【Codeforces】Gym 101156E Longest Increasing Subsequences LIS+树状数组

    题意 给定$n$个数,求最长上升子序列的方案数 根据数据范围要求是$O(n\log n)$ 朴素的dp方程式$f_i=max(f_j+1),a_i>a_j$,所以记方案数为$v_i$,则$v_i ...

  4. LintCode刷题笔记--Longest Increasing Subsequence

    标签: 动态规划 描述: Given a sequence of integers, find the longest increasing subsequence (LIS). You code s ...

  5. 【刷题-LeetCode】300. Longest Increasing Subsequence

    Longest Increasing Subsequence Given an unsorted array of integers, find the length of longest incre ...

  6. 673. Number of Longest Increasing Subsequence最长递增子序列的数量

    [抄题]: Given an unsorted array of integers, find the number of longest increasing subsequence. Exampl ...

  7. LeetCode Number of Longest Increasing Subsequence

    原题链接在这里:https://leetcode.com/problems/number-of-longest-increasing-subsequence/description/ 题目: Give ...

  8. LeetCode 673. Number of Longest Increasing Subsequence

    Given an unsorted array of integers, find the number of longest increasing subsequence. Example 1: I ...

  9. 【LeetCode】673. Number of Longest Increasing Subsequence 解题报告(Python)

    [LeetCode]673. Number of Longest Increasing Subsequence 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https:/ ...

随机推荐

  1. 内核定时器的使用(好几个例子add_timer)【转】

    转自:http://blog.csdn.net/jidonghui/article/details/7449546 LINUX内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个 ...

  2. Logback的继承体系

    今天碰到一个问题,发现控制台日志输出两遍,搜索得知,这个是由于logback继承体系导致的. logback不仅会继承level,也会继承appender,需要注意的是: <root> & ...

  3. 数据库-mysql数据连接

    一:Mysql 连接的使用 在前几章节中,我们已经学会了如果在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据. 本章节我们将向大家介绍如何使用 MySQL 的 JO ...

  4. Centos之字符串搜索命令grep

    grep [选项] 字符串 文件名 在文件当中匹配符合条件的字符串 选项: -i 忽略大小写 -v 排除指定字符串 [root@localhost ~]# grep "work" ...

  5. 开启nginx目录文件列表功能

    ngx_http_autoindex_module  此模块用于自动生成目录列表,ngx_http_autoindex_module只在 ngx_http_index_module模块未找到索引文件时 ...

  6. EXEC与sp_executesql的区别及应用

    在项目中需要将内部DECLARE的参数通过EXEC赋值后再作为下面一个EXEC参数的时候,发现都使用EXEC时,问题就不是那么简单了.趁着没有睡意研究下.EXEC的使用与缺点EXEC命令有两种用法,一 ...

  7. IdentityServer4揭秘---登录

    IdentityServer4默认提供了的登录地址是Account/Index 同意页面是Consent/Index 这里我们可以通过IdentittyServer4的用户交互自定义配置设置 在Con ...

  8. hdu 4642 翻硬币

    在一个n*m的棋盘上 每一个格子都有一枚硬币 1表示正面 0表示反面你每次可以选择一个硬币为正面的点,然后从该点与右下角点形成的矩阵硬币全都反向,直到一个人没有硬币可以选择则输Alice先手 列举了几 ...

  9. HBase(九)HBase表以及Rowkey的设计

    一 命名空间 1 命名空间的结构 1) Table:表,所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定, 则在 default 默认的命名空间中. 2) RegionServer g ...

  10. day8--by a gentlement man

    1.着装得体(不要国产.不要Jack&Johnson.selected),人都是势利眼,高素质和低素质人的区别,高素质是心里明白歧视你,但是不说:低素质是直接表示出来:lower,屌丝     ...