题目链接

操作序列的顺序显然是无关的,所以只需按特定顺序求出一个长度为\(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)的更多相关文章

  1. BZOJ 3990: [SDOI2015]排序 [搜索]

    3990: [SDOI2015]排序 题意:\(2^n\)的一个排列,给你n种操作,第i种把每\(2^{i-1}\)个数看成一段,交换任意两段.问是这个序列有序的操作方案数,两个操作序列不同,当且仅当 ...

  2. BZOJ 3990 [SDOI2015]排序

    题解: 首先很容易看出各个操作是互不影响的,即对于一个合法的操作序列,我们可以任意交换两个操作的位置而不影响合法性. 因此我们可以忽略操作先后的影响,只考虑这个操作是否会出现在操作序列中. 如果用2n ...

  3. BZOJ 3990 [SDOI2015]排序 ——搜索

    [题目分析] 可以发现,操作的先后顺序是不影响结果的,那么答案就是n!的和. 可以从小的步骤开始搜索,使得每一个当前最小的块都是上升的数列,然后看看是否可行即可. 复杂度好像是4^n [代码](哪里写 ...

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

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

  5. 【搜索】BZOJ 3990: 【Sdoi 2015】排序

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

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

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

  7. bzoj 3991: [SDOI2015]寻宝游戏 虚树 set

    目录 题目链接 题解 代码 题目链接 bzoj 3991: [SDOI2015]寻宝游戏 题解 发现每次答案就是把虚树上的路径*2 接在同一关键点上的点的dfs序是相邻的 那么用set动态维护dfs序 ...

  8. 【LG3322】[SDOI2015]排序

    [LG3322][SDOI2015]排序 题面 洛谷 题解 交换顺序显然不影响答案,所以每种本质不同的方案就给答案贡献次数的阶乘. 从小往大的交换每次至多\(4\)中决策,复杂度\(O(4^n)\). ...

  9. SDOI2015 排序

    SDOI2015 排序 今天看到这道题,没有一点思路,暴力都没的打...还是理解错题意了,操作不同位置不是说改不同的区间,而是不同操作的顺序...考场上如果知道这个的话最少暴力拿一半啊,因为正解本来就 ...

随机推荐

  1. linux常用端口查询

    0 | 无效端口,通常用于分析操作系统1 | 传输控制协议端口服务多路开关选择器2 | 管理实用程序3 | 压缩进程5 | 远程作业登录7 | 回显9 | 丢弃11 | 在线用户13 | 时间17 | ...

  2. CSS变量试玩儿

    CSS很美妙,能够为您的页面穿上衣裳,各种各样五彩斑斓的衣裳,但是对于开发者来说,他又不够灵动,于是乎有了各种各样的预处理器Sass.LESS.Stylus(笔者建议Sass的SCSS语法),这些预处 ...

  3. bzoj千题计划257:bzoj4199: [Noi2015]品酒大会

    http://www.lydsy.com/JudgeOnline/problem.php?id=4199 求出后缀数组的height 从大到小枚举,合并 维护组内 元素个数,最大.次大.最小.次小 # ...

  4. Nginx配置项优化(转载)

    (1)nginx运行工作进程个数,一般设置cpu的核心或者核心数x2 如果不了解cpu的核数,可以top命令之后按1看出来,也可以查看/proc/cpuinfo文件 grep ^processor / ...

  5. scale.fix.js

    无意间在一个网站上看到的,本来是对另一个效果感兴趣的,结果看到这个放开来的js就读了一下. var metas = document.getElementsByTagName('meta'); var ...

  6. (64位)本体学习程序(ontoEnrich)系统使用说明文档

    系统运行:文件夹system下,可执行文件ontoEnrichment 概念学习 --------------------------------------------------------1.简 ...

  7. [BZOJ 1879][SDOI 2009]Bill的挑战 题解(状压DP)

    [BZOJ 1879][SDOI 2009]Bill的挑战 Description Solution 1.考虑状压的方式. 方案1:如果我们把每一个字符串压起来,用一个布尔数组表示与每一个字母的匹配关 ...

  8. 第13月第25天 ios11 uitableview reloaddata contentsize

    1. [tableView reloadData]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_ ...

  9. 在Windows环境中利用Responder工具窃取NTLMv2哈希

    在Windows环境中利用Responder工具窃取NTLMv2哈希 翻译自:https://github.com/incredibleindishell/Windows-AD-environment ...

  10. linux 串口驱动(二)初始化 【转】

    转自:http://blog.chinaunix.net/uid-27717694-id-3493611.html 8250串口的初始化: (1)定义uart_driver.uart_ops.uart ...