bzoj3990: [SDOI2015]排序
发布日期:2021-05-06 23:47:43 浏览次数:17 分类:技术文章

本文共 1066 字,大约阅读时间需要 3 分钟。

Description

小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1<=i<=N),第i中操作为将序列从左到右划分为2^{N-i+1}段,每段恰好包括2^{i-1}个数,然后整体交换其中两段.小A想知道可以将数组A从小到大排序的不同的操作序列有多少个,小A认为两个操作序列不同,当且仅当操作个数不同,或者至少一个操作不同(种类不同或者操作位置不同).

下面是一个操作事例:

N=3,A[1..8]=[3,6,1,2,7,8,5,4].
第一次操作,执行第3种操作,交换A[1..4]和A[5..8],交换后的A[1..8]为[7,8,5,4,3,6,1,2].
第二次操作,执行第1种操作,交换A[3]和A[5],交换后的A[1..8]为[7,8,3,4,5,6,1,2].
第三次操作,执行第2中操作,交换A[1..2]和A[7..8],交换后的A[1..8]为[1,2,3,4,5,6,7,8].
Input

第一行,一个整数N

第二行,2^N个整数,A[1..2^N]

Output

一个整数表示答案

Sample Input

3

7 8 5 6 1 2 4 3

Sample Output

6

HINT

100%的数据, 1<=N<=12.

题意

自己看

题解

很容易知道,顺序是没有关系的,最后组合一下就好了

然后呢,我们知道,一般移动方案是很少的,因为你每一堆只能移动一次
其实就是恶心的暴力搜索题。。
CODE

#include
#include
#include
#include
#include
using namespace std;const int N=1<<13;int n;int s[N];inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}int ans=0;int tt[15];void SWAP(int a,int b,int x){ for (int u=0;u
上一篇:4084: [Sdoi2015]双旋转字符串
下一篇:甘蔗问题

发表评论

最新留言

很好
[***.229.124.182]2025年04月06日 23时49分55秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章