Description

小A有一个1~2N的排列A[1..2N],他希望将数组A从小到大排序。小A可以执行的操作有N种,每种操作最多可以执行一次。对于所有的i(1<=i<=N),第i种操作为:将序列从左到右划分成2N-i+1段,每段恰好包含2i-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。
第二行,2N个整数,A[1]、A[2]…A[2N]。

Output

一行,一个整数,表示可以将数组A从小到大排序的不同的操作序列的个数。

Sample Input

37 8 5 6 1 2 4 3

Sample Output

6

Data Constraint

对于30%的数据,1<=N<=4;
对于全部的数据,1<=N<=12。

解法:
先打个暴力,可以发现一个重要结论!
对于一个操作序列,如果它是合法的,那么它的全排列都是合法的。所以我们操作区间从小到大进行操作。
对于每次操作,假如我们交换的序列长度为T,那么我们将整个序列按每段2T分成多段,对于每一段,由于我们是从小到大操作,之后的操作至少都是2T的整段交换,所以这2T个数内部的相对关系在以后不会发生改变。如果要使序列合法,在这次操作后,我们至少要使每2T个数是连续递增的。
对于每次操作,我们先扫一遍,看有多少个2T的区间是不合法的。
如果不合法的区间数大于2,那么无解
如果没有不合法的区间,那么不需要进行这个长度的操作,直接跳到下一层。
如果区间数为1或2,暴力修改交换看是否能达成合法状态。(1则前后交换,2则2个区间之间进行交换,有4种方案)
你写的丑一点也是O(4^n),可以通过本题
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>using namespace std;
typedef long long ll;
ll jc[13],Ans;
int a[4201];
int n,ws,i;bool Can()
{int i;for(i=1;i<=n;i++)if(a[i]!=i)return false;return true;
}bool check(int x,int i)
{int nxt,lst;lst=(i-1)*x+x/2;nxt=lst+1;if(a[nxt]!=a[lst]+1)return false;else return true;
}void dfs(int dep,int kf)
{bool pp;int dif[3];int one,num,chk,tx,ty,i,j,l;if(Can()){Ans+=jc[kf];return;}    if(dep==ws+1)return;one=1<<dep;num=n/one;chk=0;for(i=1;i<=num;i++)if(check(one,i)==false){chk++;if(chk>2)return;dif[chk]=i;}if(chk==0)dfs(dep+1,kf);if(chk>2)return;if(chk==1){tx=(dif[chk]-1)*one+1;ty=tx+one/2;for(i=1;i<=one/2;i++)swap(a[tx+i-1],a[ty+i-1]);dfs(dep+1,kf+1);for(i=1;i<=one/2;i++)swap(a[tx+i-1],a[ty+i-1]);}if(chk==2){for(i=1;i<=2;i++)for(j=1;j<=2;j++){if(i==1)tx=(dif[1]-1)*one+1;else tx=(dif[1]-1)*one+1+one/2;if(j==1)ty=(dif[2]-1)*one+1;else ty=(dif[2]-1)*one+1+one/2;for(l=1;l<=one/2;l++)swap(a[tx+l-1],a[ty+l-1]);pp=check(one,dif[1])&check(one,dif[2]);if(pp)dfs(dep+1,kf+1);for(l=1;l<=one/2;l++)swap(a[tx+l-1],a[ty+l-1]);}}
}int main()
{scanf("%d",&ws);jc[0]=1;for(i=1;i<=ws;i++)jc[i]=jc[i-1]*i;n=1<<ws;for(i=1;i<=n;i++)scanf("%d",&a[i]);dfs(1,0);printf("%lld\n",Ans);
}

转载于:https://www.cnblogs.com/applejxt/p/4442532.html

SDOI2015 排序相关推荐

  1. BZOJ 3990: [SDOI2015]排序(搜索+剪枝)

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

  2. BZOJ.3990.[SDOI2015]排序(DFS)

    题目链接 操作序列的顺序显然是无关的,所以只需按特定顺序求出一个长度为\(l\)的操作序列,它对答案的贡献为\(l!\). 我们从小到大枚举所有选择.若当前为第\(i\)个,如果有一段长度为\(2^i ...

  3. P3322 [SDOI2015]排序

    HyperlinkHyperlinkHyperlink https://www.luogu.com.cn/problem/P3322 DescriptionDescriptionDescription ...

  4. bzoj3990【SDOI2015】排序

    3990: [SDOI2015]排序 Time Limit: 20 Sec   Memory Limit: 128 MB Submit: 521   Solved: 271 [ Submit][ St ...

  5. [暑假的bzoj刷水记录]

    (这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊  堆一起算了 隔一段更新一下.  7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...

  6. ZJOI2017 讲课Day1笔记

    额,参考一下大神的笔记.... 地址 http://www.cnblogs.com/ARZhu-NOIpAK/p/6596879.html Day1 2017-3-24 3:34:43 苟-- 富贵 ...

  7. 退役前的做题记录1.0

    退役前的做题记录1.0 租酥雨最近很懒qwq,具体表现在写题的时候不想发题解了. 但是想想这样也不太好,就决定发个一句话(半句话到几句话不等)题解上来. 2018-09.18-2018-09.28 [ ...

  8. 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法

    数据库中自定义排序 场景:有一张banner表,表中有一个status字段,有0, 1, 2三个状态位,我想要 1,0,2的自定义排序(这里是重点),然后再进行之上对sequence字段进行二次排序( ...

  9. 伍六七带你学算法 进阶篇-排序算法

    给定一个整数数组 nums,将该数组升序排列. 示例 1: 输入:[5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:[5,1,1,2,0,0] 输出:[0,0,1,1,2,5] 各排序算 ...

最新文章

  1. python3 字典修改键(key)的方法
  2. asp连接oracle 服务端,Asp.net core 3.1+EF Core2.2.6+Oracle.EntityFrameworkCore2.1.19连接Oracle数据库...
  3. SAP CRM HANA report filter的工作原理
  4. Flex4_HttpService组件
  5. 在标记的HREF属性中javascript:alert(this.innerHTML)会怎么样?
  6. Java啤酒生产系统描述_Java描述设计模式(03):工厂方法模式
  7. 仓库对象DataSet与小车对象DataAdapter的 关键命令 1201
  8. 勒索团伙正奔向 SonicWall 设备
  9. robo 3t 查询
  10. electron快捷键
  11. kettle整合kafka
  12. 希腊字母表(直接输入希腊字母的方法)
  13. 计算机硬件环境指啥,硬件环境指的是什么呢?
  14. 应用服务器和数据库服务器有什么区别
  15. 【亲测 | 007】易搜资料 V2.4.3版本 非独立版 亲测无错 | 极致技术工厂
  16. 快手Java开发二面面经分享
  17. 抖音小店还能做吗?如何解决拍单问题?
  18. 【LeetCode Python实现】 5473. 灯泡开关 IV(中等)
  19. python中文居中对齐处理
  20. 国外智能化农机装备简介

热门文章

  1. 一招教你在linux服务器配置Jenkins持续集成神器
  2. 高效测试必学 | 用pytest生成测试报告
  3. 「1024 程序员节」各大公司和程序员们都是怎么过的?你都做了哪些计划或安排?
  4. 性能测试很难吗?一文带你学会性能测试核心流程和概念
  5. 面试中软性问题的套路与反套路
  6. python 生成exe 并 执行程序
  7. 云起作者认证大神_2020网络文学“白金大神”名单出炉!顶级作家是怎样炼成的?...
  8. 《深度学习要领》端到端的深度学习技术
  9. 藏红花怎么推广?百度下拉词|抖音下拉词框|信息流推广-三剑合璧
  10. android 梅花布局,Android相对布局实现各种梅花效果