排序

HYSBZ - 3990

小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 Output6
Hint100%的数据, 1<=N<=12.

sol:从小段到大段搜,一段段分开后,如果有两段以上不是严格升序就挂了,如果只有一段就换一下接着搜,两段的话就是交叉互换,满足条件接着搜

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
ll s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=;
int n,a[N];
ll ans=,Jiec[],Bin[];
inline bool Check(int Pos,int K)
{
int i;
for(i=;i<Bin[K];i++) if(a[Pos+i-]+!=a[Pos+i]) return false;
return true;
}
inline void Swap(int P1,int P2,int K)
{
int i;
for(i=;i<=Bin[K];i++) swap(a[P1+i-],a[P2+i-]);
}
inline void dfs(int K,int Step)
{
if(K==n+)
{
ans+=Jiec[Step]; return;
}
int i,op1,op2,p1=,p2=;
for(i=;i<=Bin[n];i+=Bin[K]) if(!Check(i,K))
{
if(!p1) p1=i;
else if(!p2) p2=i;
else return;
}
if(!p1) dfs(K+,Step);
else if(!p2)
{
Swap(p1,p1+Bin[K-],K-);
dfs(K+,Step+);
Swap(p1,p1+Bin[K-],K-);
}
else
{
for(op1=;op1<=;op1++) for(op2=;op2<=;op2++)
{
Swap(p1+op1*Bin[K-],p2+op2*Bin[K-],K-);
if(Check(p1,K)&&Check(p2,K))
{
dfs(K+,Step+);
Swap(p1+op1*Bin[K-],p2+op2*Bin[K-],K-);
break;
}
Swap(p1+op1*Bin[K-],p2+op2*Bin[K-],K-);
}
}
return;
}
int main()
{
int i;
Jiec[]=; for(i=;i<=;i++) Jiec[i]=1ll*Jiec[i-]*i;
Bin[]=; for(i=;i<=;i++) Bin[i]=Bin[i-]<<1ll;
R(n);
for(i=;i<=Bin[n];i++) R(a[i]);
dfs(,);
Wl(ans);
return ;
}
/*
input
3
7 8 5 6 1 2 4 3
output
6
*/

bzoj3990的更多相关文章

  1. [BZOJ3990][SDOI2015]排序(DFS)

    3990: [SDOI2015]排序 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 902  Solved: 463[Submit][Status][ ...

  2. Bzoj3990 [SDOI2015]排序

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 651  Solved: 338 Description 小A有一个1-2^N的排列A[1..2^N], ...

  3. BZOJ3990:[SDOI2015]排序——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3990 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作 ...

  4. [bzoj3990][SDOI2015]排序-搜索

    Brief Description 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1<=i<= ...

  5. [SDOI2015][bzoj3990] 序列 [搜索]

    题面 传送门 思路 首先,这道题目有一个非常显然(但是我不会严格证明,只能意会一下)的结论:一个合法的操作序列中,任意两个操作是可以互换的 那么,这个结论加上本题极小的数据范围,为什么不搜索一下呢? ...

  6. BZOJ3990 排序(sort)

    排序(sort) 题目描述 小A有一个1~2N的排列A[1..2N],他希望将数组A从小到大排序.小A可以执行的操作有N种,每种操作最多可以执行一次.对于所有的i(1<=i<=N),第i种 ...

  7. BZOJ3990 [SDOI2015]排序 【搜索】

    题目 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1<=i<=N),第i中操作为将序列从左到 ...

  8. BZOJ3990 排序

    题目:www.lydsy.com/JudgeOnline/problem.php?id=3990 这题很不错. 刚开始时无从下手,想了好多$O((2^n)log(2^n))$ 的idea,但是都不行. ...

  9. [BZOJ3990]:[SDOI2015]排序(搜索)

    题目传送门 题目描述 小A有一个1-${2}^{N}$的排列A[1..${2}^{N}$],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1≤i≤N), ...

随机推荐

  1. C语言写郑州大学校友通讯录

    #include <stdio.h> #include <string.h> #include <stdlib.h> #define LEN sizeof(stru ...

  2. IIS Express启动不了的的解决方案

    netsh http show iplisten netsh http delete iplisten ipaddress=11.22.33.44 (where 11.22.33.44 is the ...

  3. Css文字效果

    1.文字样式:font-family 字体:sans-serif(字体醒目):serif(笔画的开始和结束有额外的修饰部分,易读性较强) *页面设计最好有多个备选字体 2.文字大小:font-size ...

  4. Windows10出现打开EXE应用程序错误

    运行部分EXE文件,弹出错误“该文件没有与之关联的程序来执行该操作 右键开始菜单, PowerShell(管理员)  也是一样 连安装程序Vs2017都无法启动,用了多种方法都不能搞定. 花了不少时间 ...

  5. js修改当前页面地址栏参数

    利用HTML5 history新特性replaceState方法可以修改当前页面地址栏参数,示例代码: //选择日期后改变地址栏 var urlSearch = location.href; var ...

  6. JavaScript例子2-使一个特定的表格隔行变色

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. CTF 常见操作总结

    一般流程 首先看header, veiwsource, 目录扫描 有登陆, 尝试sql注入&爆破 有数据库, 必然sql注入? 普通sql注入 判断是否存在回显异常 尝试单双引号 查是字符型? ...

  8. Resource通配符路径 ——跟我学spring3

    转自: https:// jinnianshilongnian.iteye.com/blog/1416322

  9. Vim中复制粘贴缩进错乱问题的解决方案

    Vim中复制粘贴缩进错乱问题的解决方案 当你把这段缩进优美的代码直接ctrl+c,ctrl+v到Vim的时候,就会出现如下恶心的情况 可以看到,这种直接粘贴的方式会导致代码丢失和缩进错乱等情况. 解决 ...

  10. windows2012获取明文密码

    windows 2012获取明文密码 导hash的话用常规的方法就可以. 修改注册表 reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contr ...