#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL; const int N = 1 << 13;
int n , a[N];
LL ans , fac[13]; inline bool check(int len)
{
for(register int i = 1; i <= 1 << n - len; i++)
if (a[(i - 1) * (1 << len) + 1] + (1 << len - 1) != a[(i - 1) * (1 << len) + 1 + (1 << len-1)])
return false;
return true;
} inline void sswap(int s , int t , int len)
{
for(register int i = 0; i < len; i++)
swap(a[s + i] , a[t + i]);
} inline void dfs(int len , int step)
{
if (len && !check(len)) return;
if (len == n)
{
ans += fac[step];
return;
}
dfs(len + 1 , step);
int tot = 0 , c[5];
for(register int i = 1; i <= 1 << n - len; i += 2)
if (a[(i - 1) * (1 << len) + 1] + (1 << len) != a[i * (1 << len) + 1])
{
if (tot >= 4) return;
c[++tot] = i , c[++tot] = i + 1;
}
if (!tot) return;
for(register int i = 1; i <= tot; i++)
for(register int j = i + 1; j <= tot; j++)
{
sswap((c[i] - 1) * (1 << len) + 1 , (c[j] - 1) * (1 << len) + 1 , 1 << len);
dfs(len + 1 , step + 1);
sswap((c[i] - 1) * (1 << len) + 1 , (c[j] - 1) * (1 << len) + 1 , 1 << len);
}
} int main()
{
scanf("%d" , &n);
for(register int i = 1; i <= (1 << n); i++) scanf("%d" , &a[i]);
fac[0] = 1;
for(register int i = 1; i <= n; i++) fac[i] = fac[i - 1] * 1LL * i;
dfs(0 , 0);
printf("%lld" , ans);
}

【SDOI2015】排序的更多相关文章

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

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

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

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

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

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

  4. 【LG3322】[SDOI2015]排序

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

  5. SDOI2015 排序

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

  6. Bzoj3990 [SDOI2015]排序

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 651  Solved: 338 Description 小A有一个1-2^N的排列A[1..2^N], ...

  7. BZOJ3990:[SDOI2015]排序——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3990 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作 ...

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

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

  9. BZOJ3990 [SDOI2015]排序 【搜索】

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

  10. [sdoi2015]排序(搜索+剪枝优化)

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

随机推荐

  1. 关于解决scapy.error.Scapy_Exception: tcpdump is not available. Cannot use filter !报错

    解决办法 sudo apt install tcpdump 后续 我特意没写到我的 arp 攻击那篇文章里面,就是为了水一片文章

  2. python3获取列表逆序的五种方式

    前言 我们将这几种方式分为两类,一种是对列表本身进行操作,改变对应内存中的值,另一种是带有返回值的,相当于拷贝了一份 对列表内存中进行操作 sort() 函数 a = [1,2,3,4] a.sort ...

  3. 《HelloGitHub》第 80 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...

  4. 第2-4-9章 规则引擎Drools实战(2)-信用卡申请

    目录 9.2 信用卡申请 9.2.1 计算规则 9.2.2 实现步骤 9.2 信用卡申请 全套代码及资料全部完整提供,点此处下载 本小节我们需要通过Drools规则引擎来根据规则进行申请人的合法性检查 ...

  5. Hadoop安装-分布式-Fully

    Hadoop安装-分布式-Fully 〇.所需资料 一.配置 1.基础配置 (1)系统安装 (2)hostname主机名配置 (3)ip地址.dns.hosts映射文件配置 (4)关闭防火墙与seli ...

  6. C++四舍五入并且保留7为小数

    问题描述给定圆的半径r,求圆的面积.输入格式输入包含一个整数r,表示圆的半径.输出格式输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积.说明:在本题中,输入是一个整数,但是输出是一个实数 ...

  7. 利用云服务提供商的免费证书,在服务器上发布https前端应用和WebAPI的应用

    我们如果要在服务器上发布https前端应用和WebAPI的应用,那么我们就需要用到https证书了.我们一般发布的应用的云服务器上,都会提供一定量的相关的免费证书(一般为20个)供我们使用,每个一年期 ...

  8. SpringBoot基础学习笔记

    Springboot框架: springboot官网参考 Sringboot是整合spring技术栈的一站式框架,其简化配置,实现了自动化配置 Springboot基础结构: 1.pom.xml文件: ...

  9. 主题 1 The Shell

    主题 1 The Shell 课程概览与 shell · the missing semester of your cs education (missing-semester-cn.github.i ...

  10. 一问读懂Web3 架构

    最近看了一些Web3.0的文章,总结了一些个人的理解: Web3.0 通过区块链基础设施管理用户数据,重构用户和互联网平台之间的关系和交互,重新定义了互联网应用的架构方式和交互模式. Web 1.0 ...