【题目分析】

可以发现,操作的先后顺序是不影响结果的,那么答案就是n!的和。

可以从小的步骤开始搜索,使得每一个当前最小的块都是上升的数列,然后看看是否可行即可。

复杂度好像是4^n

【代码】(哪里写挂了,意会一下就好了)

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib> #include <map>
#include <set>
#include <queue>
#include <string>
#include <iostream>
#include <algorithm> using namespace std; #define maxn 5005
#define ll long long
#define mlog 15
#define inf 0x3f3f3f3f
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i) void Finout()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
#endif
} int Getint()
{
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
} int a[mlog][maxn],b[maxn],n,cnt=0,s;
ll ans=0;
ll fac[mlog]; void solve(int now,int n)
{
if (n==1)
{
ans+=fac[s];
return ;
}
int cnt=0;
int pos1=0,pos2=0;
for (int i=1;i<=n;i+=2)
{
if (a[now][i]>a[now][i+1])
{
cnt++;
if (!pos1) pos1=i;
else pos2=i;
}
if (cnt>2) return ;
}
if (cnt==0)
{
for (int i=1;i<=n/2;++i)
a[now+1][i]=(a[now][i*2-1]+1)/2;
solve(now+1,n/2);
}
else
{
if (cnt==1)
{
swap(a[now][pos1],a[now][pos1+1]);
s++;
for (int i=1;i<=n/2;++i)
a[now+1][i]=(a[now][i*2-1]+1)/2;
solve(now+1,n/2);
s--;
swap(a[now][pos1],a[now][pos1+1]);
}
else
{
swap(a[now][pos1],a[now][pos2]);
if (a[now][pos1]<a[now][pos1+1]&&a[now][pos2]<a[now][pos2+1])
{
s++;
for (int i=1;i<=n/2;++i)
a[now+1][i]=(a[now][i*2-1]+1)/2;
solve(now+1,n/2);
s--;
}
swap(a[now][pos1],a[now][pos2]); swap(a[now][pos1+1],a[now][pos2]);
if (a[now][pos1]<a[now][pos1+1]&&a[now][pos2]<a[now][pos2+1])
{
s++;
for (int i=1;i<=n/2;++i)
a[now+1][i]=(a[now][i*2-1]+1)/2;
solve(now+1,n/2);
s--;
}
swap(a[now][pos1+1],a[now][pos2]); swap(a[now][pos1],a[now][pos2+1]);
if (a[now][pos1]<a[now][pos1+1]&&a[now][pos2]<a[now][pos2+1])
{
s++;
for (int i=1;i<=n/2;++i)
a[now+1][i]=(a[now][i*2-1]+1)/2;
solve(now+1,n/2);
s--;
}
swap(a[now][pos1],a[now][pos2+1]); swap(a[now][pos1+1],a[now][pos2+1]);
if (a[now][pos1]<a[now][pos1+1]&&a[now][pos2]<a[now][pos2+1])
{
s++;
for (int i=1;i<=n/2;++i)
a[now+1][i]=(a[now][i*2-1]+1)/2;
solve(now+1,n/2);
s--;
}
swap(a[now][pos1+1],a[now][pos2+1]);
}
}
return ;
} int main()
{
Finout();
n=Getint();
n=1<<n;
fac[0]=1;
F(i,1,12) fac[i]=fac[i-1]*i;
F(i,1,n) a[1][i]=Getint();
solve(1,n);
cout<<ans<<endl;
}

  

BZOJ 3990 [SDOI2015]排序 ——搜索的更多相关文章

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

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

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

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

  3. BZOJ 3990 [SDOI2015]排序

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

  4. [bzoj3990][SDOI2015]排序-搜索

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

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

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

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

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

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

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

  8. 006-筛选分类排序搜索查找Filter-Classificatio-Sort-Search-Find-Seek-Locate

    006-筛选分类排序搜索查找Filter-Classificatio-Sort-Search-Find-Seek-Locate https://www.cnblogs.com/delphixx/p/1 ...

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

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

随机推荐

  1. 中移动TD-LTE 4G设备招标

    移动这是要干吗呢?2%的份额,公司如果没有其他业务,可以消失了 ------------------------------------------------------ 中国移动已经初步确定了各供 ...

  2. swift 接水果游戏ios源码

    初学swift,写来练手的,游戏很简单 ,顾名思义就是接水果 ,菠萝不能接,接到一个水果得一分,接到菠萝扣五分,漏一个水果扣一分,初始分0分,当分数低于0分 就Game Over了,暂时适用5s的模拟 ...

  3. python_108_格式化字符串format函数

    #通过关键字映射 print('I am {name},age {age}'.format(name='qiqi齐',age=18))#I am qiqi齐,age 18 dictory={'name ...

  4. js获取当前日期、前一天、后一天的日期的例子

    <script> function addByTransDate(dateParameter, num) { var translateDate = "", dateS ...

  5. 如何查看 JAR 包的源代码

    ava 项目的编译文件经常被打包成 JAR(Java Archive,Java 归档文件)文件,当然,作为学习,有时候也非常想看到这个 JAR 被打包前的源代码是怎么样的. 下面提供几种查看 JAR ...

  6. CSS 隐藏 visibility 属性

    定义和用法 visibility 属性规定元素是否可见. 提示:即使不可见的元素也会占据页面上的空间.请使用 "display" 属性来创建不占据页面空间的不可见元素. 说明 这个 ...

  7. 主DNS服务-正向解析

    环境 准备最少两台主机 一台当DNS服务器,一台当客户机 如:192.168.43.7这台主机当DNS服务器,192.168.43.6这台主机当客户机 安装DNS服务 yum install -y b ...

  8. node.js----服务器http

    请求网址过程: 1.用户通过浏览器发送一个http的请求到指定的主机 2.服务器接收到该请求,对该请求进行分析和处理 3.服务器处理完成以后,返回对应的数据到用户机器 4.浏览器接收服务器返回的数据, ...

  9. Python基础-__main__

    Python基础-_main_ 写在前面 如非特别说明,下文均基于Python3 一.__main__的官方解释 参考 _main_ -- Top-level script environment ' ...

  10. logging日志模块,四种方式

    1.最简单的用法 import logging logging.error("hah") logging.info("hah") logging.debug(& ...