题目链接

操作序列的顺序显然是无关的,所以只需按特定顺序求出一个长度为\(l\)的操作序列,它对答案的贡献为\(l!\)。
我们从小到大枚举所有选择。若当前为第\(i\)个,如果有一段长度为\(2^i\)不是+1+1这样递增的,那么需要把它分为两段长度为\(2^{i-1}\)的然后交换(在此之前满足所有长度更小的如\(2^{i-1}\)递增)。
如果有两段长度为\(2^i\)的非每次加1的递增段,会有四种情况,如\(3,8,\cdots,7,4\)(也可能无解:\(8,3,\cdots,7,4\)),即把这两段分成四段长度为\(2^{i-1}\)的,然后枚举四种情况(只会有两种可行方案吧)交换,如果可行下一层DFS。
如果多于两段,不可能有解。
如果没有,那不能交换,下一层。

//836kb 164ms (BZOJ怎么也那么多0ms。。)
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
const int N=(1<<12)+3;int n,A[N],fac[15],bit[15];
long long Ans;inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}
bool Check(int p,int k)
{for(int i=p; i<p+k-1; ++i)if(A[i]+1!=A[i+1]) return 0;return 1;
}
void Swap(int p1,int p2,int k)
{for(int i=0; i<k; ++i)std::swap(A[p1+i],A[p2+i]);
}
void DFS(int p,int cnt)
{if(p>n) Ans+=fac[cnt];else{int p1=0,p2=0;for(int i=1; i<=bit[n]; i+=bit[p])if(!Check(i,bit[p])){if(!p1) p1=i;else if(!p2) p2=i;else return;}if(!p1&&!p2) DFS(p+1,cnt);else if(p1&&!p2)Swap(p1,p1+bit[p-1],bit[p-1]), DFS(p+1,cnt+1), Swap(p1,p1+bit[p-1],bit[p-1]);else{for(int i=0; i<=1; ++i)for(int j=0; j<=1; ++j){Swap(p1+i*bit[p-1],p2+j*bit[p-1],bit[p-1]);if(Check(p1,bit[p])&&Check(p2,bit[p]))//两个位置!{DFS(p+1,cnt+1);Swap(p1+i*bit[p-1],p2+j*bit[p-1],bit[p-1]);break;}Swap(p1+i*bit[p-1],p2+j*bit[p-1],bit[p-1]);}}}
}int main()
{fac[0]=fac[1]=1;for(int i=2; i<=12; ++i) fac[i]=fac[i-1]*i;for(int i=0; i<=12; ++i) bit[i]=1<<i;n=read();for(int i=1; i<=bit[n]; ++i) A[i]=read();DFS(1,0);printf("%lld",Ans);return 0;
}

转载于:https://www.cnblogs.com/SovietPower/p/8690972.html

BZOJ.3990.[SDOI2015]排序(DFS)相关推荐

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

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

  2. UVa11770 - Lighting Away(排序+DFS)

    J Lighting Away Input: Standard Input Output: Standard Output Ronju is a night-guard at the "La ...

  3. python 拓扑排序 dfs bfs_拓扑排序的DFS和BFS

    博主以前有一个疑问,DFS和BFS各自的适用范围是?我想你今天看了这篇文章之后会有一个判断! BFS 数据结构与算法分析:c语言描述(p217) 已经存在一个Indgree入度数组(indgree[v ...

  4. BZOJ 3991: [SDOI2015]寻宝游戏

    随便选一个点当做根,跑每个点的深度(为了求LCA)d [ u ] ,和到根节点的距离(为了更新答案) l [ u ] 我们发现,由关键点和他们的LCA构成的虚树(其实就是忽略其他节点),由于还要回到原 ...

  5. python 拓扑排序 dfs bfs_bfs与dfs的优缺点?

    刚好今天作业有道题问了相似问题= =,顺便来回答一下 DFS和BFS主要差别在于BFS遍历方式是围绕着根结点一圈一圈(level by level)向外遍历,借助队列的方式实现,而DFS的方式则是从一 ...

  6. [Leetcode][第207题][JAVA][课程表][拓扑排序][DFS]

    [问题描述][中等] [解答思路] 1. 拓扑排序 复杂度分析 HashSet[] 数组 import java.util.HashSet; import java.util.LinkedList; ...

  7. LeetCode 1273. 删除树节点(拓扑排序/DFS)

    文章目录 1. 题目 2. 解题 2.1 取巧解 2.2 拓扑排序 2.3 建图+DFS 1. 题目 给你一棵以节点 0 为根节点的树,定义如下: 节点的总数为 nodes 个: 第 i 个节点的值为 ...

  8. SDOI2015 排序

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

  9. python 拓扑排序 dfs bfs_图遍历算法之DFS/BFS

    在计算机科学, 图遍历(Tree Traversal,也称图搜索)是一系列图搜索的算法, 是单次访问树结构类型数据(tree data structure)中每个节点以便检查或更新的一系列机制.图遍历 ...

最新文章

  1. python条形图间距-Python-Matplotlib 5 条形图
  2. ASP.NET夜话笔记06
  3. python鸡兔同笼编程输出不存在合理答案_Python 解答鸡兔同笼和五家共井问题
  4. java文件名大小_java 比较指定文件夹内.txt文件名的大小
  5. LeetCode 344 反转字符串
  6. [专栏精选]Unity刚体详解
  7. 03-22 H5 性能分析
  8. 在asp.net如何取得ActiveDirectory域中用户的信息,比如工号,邮件地址等等
  9. SPI 机制-插件化扩展功能
  10. [工程经验] 电气与控制系统设计方案(框架)- 机器人
  11. 快速使用ros小乌龟教程——ROS初体验
  12. (诛仙剑C-SKY)1-初识
  13. python scapy 抓包_Python3下基于Scapy库完成网卡抓包解析
  14. 通过手机型号查找相应UA信息
  15. OpenCV图像处理学习四,像素的读写操作和图像反差函数操作
  16. 线性代数学习笔记3-4:描述线性变换的空间压缩情况(列空间、秩)
  17. npm ERR! code ENOENT npm ERR! syscall open npm ERR! path C:\Users\package.jsonnpm ERR! code ENOENT n
  18. 电脑高手常用的五个按钮
  19. 如何删除金山毒霸的顽固的残留文件?
  20. 挂件巡检机器人_盘点国内五大智能巡检机器人公司

热门文章

  1. 15款免费的 HTML5/CSS3 响应式网页模板
  2. 从Windows7光盘中提取WinPE
  3. 安全策略已传播,但有警告信息。0x534:帐户名与安全标识间无任何映射完成
  4. 史诗巨作[关云长][高清BD-RMVB/992M][国语/中文字幕]
  5. 蓝桥杯 省赛 python_第十一届蓝桥杯软件省级大赛第二场python3,类省赛,Python3
  6. python编写简易超市系统_简易控制台超市销售系统|Python练习系列[1]
  7. Coin98 Finance获Alameda Research 400万美元投资
  8. LBRY:美SEC对我们的指控将威胁到整个加密货币行业
  9. 1月20日到期的5.2万美元比特币期权数量超1万份
  10. ParaFi Capital资产管理规模超1亿美元,至少投资22家公司或协议