BZOJ.3990.[SDOI2015]排序(DFS)
操作序列的顺序显然是无关的,所以只需按特定顺序求出一个长度为\(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;
}
BZOJ.3990.[SDOI2015]排序(DFS)的更多相关文章
- BZOJ 3990: [SDOI2015]排序 [搜索]
3990: [SDOI2015]排序 题意:\(2^n\)的一个排列,给你n种操作,第i种把每\(2^{i-1}\)个数看成一段,交换任意两段.问是这个序列有序的操作方案数,两个操作序列不同,当且仅当 ...
- BZOJ 3990 [SDOI2015]排序
题解: 首先很容易看出各个操作是互不影响的,即对于一个合法的操作序列,我们可以任意交换两个操作的位置而不影响合法性. 因此我们可以忽略操作先后的影响,只考虑这个操作是否会出现在操作序列中. 如果用2n ...
- BZOJ 3990 [SDOI2015]排序 ——搜索
[题目分析] 可以发现,操作的先后顺序是不影响结果的,那么答案就是n!的和. 可以从小的步骤开始搜索,使得每一个当前最小的块都是上升的数列,然后看看是否可行即可. 复杂度好像是4^n [代码](哪里写 ...
- [BZOJ3990][SDOI2015]排序(DFS)
3990: [SDOI2015]排序 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 902 Solved: 463[Submit][Status][ ...
- 【搜索】BZOJ 3990: 【Sdoi 2015】排序
3990: [SDOI2015]排序 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 336 Solved: 164[Submit][Status][ ...
- BZOJ 3990: [SDOI2015]排序(搜索+剪枝)
[SDOI2015]排序 Description 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1< ...
- bzoj 3991: [SDOI2015]寻宝游戏 虚树 set
目录 题目链接 题解 代码 题目链接 bzoj 3991: [SDOI2015]寻宝游戏 题解 发现每次答案就是把虚树上的路径*2 接在同一关键点上的点的dfs序是相邻的 那么用set动态维护dfs序 ...
- 【LG3322】[SDOI2015]排序
[LG3322][SDOI2015]排序 题面 洛谷 题解 交换顺序显然不影响答案,所以每种本质不同的方案就给答案贡献次数的阶乘. 从小往大的交换每次至多\(4\)中决策,复杂度\(O(4^n)\). ...
- SDOI2015 排序
SDOI2015 排序 今天看到这道题,没有一点思路,暴力都没的打...还是理解错题意了,操作不同位置不是说改不同的区间,而是不同操作的顺序...考场上如果知道这个的话最少暴力拿一半啊,因为正解本来就 ...
随机推荐
- Linux shell 日期,时间相关的命令
在shell脚本中,经常要用到跟获取日期相关的东西,这里记录一下Linux shell 获取日期的方法 获取当前日期:today=`date +"%Y-%m-%d"` 获取昨天的日 ...
- 【整理】Git相关资料
http://book.51cto.com/art/201107/278731.htm http://book.51cto.com/art/201107/278828.htm
- 利用fiddler来模拟低速环境
为了让我们的站点拥有更好的用户体验,更短的加载时间,我们会“按需加载”页面的资源. 在调试程序的时候,我们希望能有一个低速率的网络环境来模拟真实线上的环境,这个时候fiddler(下载fiddler请 ...
- 高品质的JavaScript
整理书籍内容(QQ:283125476 发布者:M [重在分享,有建议请联系->QQ号]) 养成良好的编程习惯 ##如何避免团队JS冲突 * 避免实用全局变量[可使用匿名函数进行处理]以避免全局 ...
- 将本地的mongodb迁移到阿里云
首先在阿里云上安装mongodb,可以根据官方教程 https://docs.mongodb.com/manual/tutorial/install-mongodb-on-amazon/ 完成之后启动 ...
- Anaconda+django写出第一个web app(十)
今天继续学习外键的使用. 当我们有了category.series和很多tutorials时,我们查看某个tutorial,可能需要这样的路径http://127.0.0.1:8000/categor ...
- 内置函数bytes()
a=b'\x00\x9c@c' print a[3]#99,c的ascii码是99 print a[1]#156 并且byte是无法修改的 c[1]=155 Traceback (most recen ...
- FFT(Rock Paper Scissors Gym - 101667H)
题目链接:https://vjudge.net/problem/Gym-101667H 题目大意:首先给你两个字符串,R代表石头,P代表布,S代表剪刀,第一个字符串代表第一个人每一次出的类型,第二个字 ...
- 基于ZedBoard的Webcam设计(一):USB摄像头(V4L2接口)的图片采集【转】
转自:http://www.cnblogs.com/surpassal/archive/2012/12/19/zed_webcam_lab1.html 一直想把USB摄像头接到Zedboard上,搭建 ...
- SQL008存储过程总结
1.如何调用存储过程 DECLARE @Id INT --输入参数 DECLARE @OutPutID INT --输出参数 EXEC [dbo].Order_SellPR @Id,@OutPutID ...