[BZOJ3990][SDOI2015]排序(DFS)
3990: [SDOI2015]排序
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 902 Solved: 463
[Submit][Status][Discuss]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 3Sample Output
6HINT
100%的数据, 1<=N<=12.
Source
深搜即可,从小到大搜就可以确定这种操作对谁使用了。
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
typedef long long ll;
using namespace std; const int N=;
int n,bin[],a[N];
ll fac[],ans; bool check(int x,int k){ rep(i,x+,x+k-) if (a[i]!=a[i-]+) return ; return ; }
void work(int x,int y,int k){ rep(i,,k-) swap(a[x+i],a[y+i]); } void dfs(int x,int s){
if (x==n+) { ans+=fac[s]; return; }
int t1=,t2=;
for (int i=; i<=bin[n]; i+=bin[x])
if (!check(i,bin[x])){
if (!t1) t1=i;
else if (!t2) t2=i;
else return;
}
if (!t1) { dfs(x+,s); return; }
if (!t2) work(t1,t1+bin[x-],bin[x-]),dfs(x+,s+),work(t1,t1+bin[x-],bin[x-]);
else
rep(a,,) rep(b,,){
work(t1+a*bin[x-],t2+b*bin[x-],bin[x-]);
if (check(t1,bin[x]) && check(t2,bin[x])){
dfs(x+,s+);
work(t1+a*bin[x-],t2+b*bin[x-],bin[x-]);
break;
}
work(t1+a*bin[x-],t2+b*bin[x-],bin[x-]);
}
} int main(){
freopen("bzoj3990.in","r",stdin);
freopen("bzoj3990.out","w",stdout);
scanf("%d",&n); fac[]=bin[]=;
rep(i,,) fac[i]=fac[i-]*i,bin[i]=bin[i-]<<;
rep(i,,bin[n]) scanf("%d",&a[i]);
dfs(,); printf("%lld\n",ans);
return ;
}
[BZOJ3990][SDOI2015]排序(DFS)的更多相关文章
- Bzoj3990 [SDOI2015]排序
		
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 651 Solved: 338 Description 小A有一个1-2^N的排列A[1..2^N], ...
 - [bzoj3990][SDOI2015]排序-搜索
		
Brief Description 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1<=i<= ...
 - BZOJ3990 [SDOI2015]排序  【搜索】
		
题目 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1<=i<=N),第i中操作为将序列从左到 ...
 - [BZOJ3990]:[SDOI2015]排序(搜索)
		
题目传送门 题目描述 小A有一个1-${2}^{N}$的排列A[1..${2}^{N}$],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1≤i≤N), ...
 - BZOJ.3990.[SDOI2015]排序(DFS)
		
题目链接 操作序列的顺序显然是无关的,所以只需按特定顺序求出一个长度为\(l\)的操作序列,它对答案的贡献为\(l!\). 我们从小到大枚举所有选择.若当前为第\(i\)个,如果有一段长度为\(2^i ...
 - BZOJ 3990: [SDOI2015]排序 [搜索]
		
3990: [SDOI2015]排序 题意:\(2^n\)的一个排列,给你n种操作,第i种把每\(2^{i-1}\)个数看成一段,交换任意两段.问是这个序列有序的操作方案数,两个操作序列不同,当且仅当 ...
 - BZOJ 3990: [SDOI2015]排序(搜索+剪枝)
		
[SDOI2015]排序 Description 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1< ...
 - 【LG3322】[SDOI2015]排序
		
[LG3322][SDOI2015]排序 题面 洛谷 题解 交换顺序显然不影响答案,所以每种本质不同的方案就给答案贡献次数的阶乘. 从小往大的交换每次至多\(4\)中决策,复杂度\(O(4^n)\). ...
 - SDOI2015 排序
		
SDOI2015 排序 今天看到这道题,没有一点思路,暴力都没的打...还是理解错题意了,操作不同位置不是说改不同的区间,而是不同操作的顺序...考场上如果知道这个的话最少暴力拿一半啊,因为正解本来就 ...
 
随机推荐
- HDU   1372   Knight Moves    (广搜)
			
题目链接 Problem Description A friend of you is doing research on the Traveling Knight Problem (TKP) whe ...
 - HDU 1728    逃离迷宫    (广搜)
			
题目链接 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可 ...
 - js_开发小技巧记录(一)
			
(一) 生成从minNum到maxNum的随机数 <!DOCTYPE html> <html> <head> <meta charset="UTF- ...
 - Python3.3.3 安装(Linux系统)
			
1.wget http://www.python.org/ftp/python/3.3.3/Python-3.3.3.tgz //检查http://www.python.org/ftp/python网 ...
 - 8.0docker的客户端和守护进程
			
C/S 链接的方式 unix:///var/run/docker.sock 默认的 tcp://host:port fd://socketfd 在linux上进行socket 模拟 nc -U /va ...
 - PKUWC 2019 自闭记
			
PKUWC 2019 自闭记 Day -1 考前天天在隔壁的物竞教室划水(雀魂,能和吉老师一起玩的游戏都是好游戏),没有做题. Day 0 早上8:16的高铁,到广州南居然要6个小时...不知道福州和 ...
 - Caffe学习笔记3
			
Caffe学习笔记3 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和h ...
 - monkey测试===easyMonkey测试【推荐】
			
easymonkey测试: easymonkey是基于monkey测试的一个二次开发工具.(关于monkey测试参见之前blog) easymonkey的特点就是方便,解决了很多参数命令上设置的麻烦, ...
 - 2017中国大学生程序设计竞赛 - 网络选拔赛  HDU 6153 A Secret KMP,思维
			
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6153 题意:给了串s和t,要求每个t的后缀在在s中的出现次数,然后每个次数乘上对应长度求和. 解法:关 ...
 - linux sftp and unix ftp
			
sftp 1.功能作用 sftp 是一个交互式文件传输程式.它类似于 ftp, 但它进行加密传输,比FTP有更高的安全性. 2.位置 /usr/bin/sftp 3.格式用法 sftp [-1246C ...