bzoj3990
排序
小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1<=i<=N),第i中操作为将序列从左到右划分为2^{N-i+1}段,每段恰好包括2^{i-1}个数,然后整体交换其中两段.小A想知道可以将数组A从小到大排序的不同的操作序列有多少个,小A认为两个操作序列不同,当且仅当操作个数不同,或者至少一个操作不同(种类不同或者操作位置不同).
Input
第一行,一个整数N
Output
一个整数表示答案
Sample Input 3
7 8 5 6 1 2 4 3
Sample Output6
Hint100%的数据, 1<=N<=12.
sol:从小段到大段搜,一段段分开后,如果有两段以上不是严格升序就挂了,如果只有一段就换一下接着搜,两段的话就是交叉互换,满足条件接着搜
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
ll s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=;
int n,a[N];
ll ans=,Jiec[],Bin[];
inline bool Check(int Pos,int K)
{
int i;
for(i=;i<Bin[K];i++) if(a[Pos+i-]+!=a[Pos+i]) return false;
return true;
}
inline void Swap(int P1,int P2,int K)
{
int i;
for(i=;i<=Bin[K];i++) swap(a[P1+i-],a[P2+i-]);
}
inline void dfs(int K,int Step)
{
if(K==n+)
{
ans+=Jiec[Step]; return;
}
int i,op1,op2,p1=,p2=;
for(i=;i<=Bin[n];i+=Bin[K]) if(!Check(i,K))
{
if(!p1) p1=i;
else if(!p2) p2=i;
else return;
}
if(!p1) dfs(K+,Step);
else if(!p2)
{
Swap(p1,p1+Bin[K-],K-);
dfs(K+,Step+);
Swap(p1,p1+Bin[K-],K-);
}
else
{
for(op1=;op1<=;op1++) for(op2=;op2<=;op2++)
{
Swap(p1+op1*Bin[K-],p2+op2*Bin[K-],K-);
if(Check(p1,K)&&Check(p2,K))
{
dfs(K+,Step+);
Swap(p1+op1*Bin[K-],p2+op2*Bin[K-],K-);
break;
}
Swap(p1+op1*Bin[K-],p2+op2*Bin[K-],K-);
}
}
return;
}
int main()
{
int i;
Jiec[]=; for(i=;i<=;i++) Jiec[i]=1ll*Jiec[i-]*i;
Bin[]=; for(i=;i<=;i++) Bin[i]=Bin[i-]<<1ll;
R(n);
for(i=;i<=Bin[n];i++) R(a[i]);
dfs(,);
Wl(ans);
return ;
}
/*
input
3
7 8 5 6 1 2 4 3
output
6
*/
bzoj3990的更多相关文章
- [BZOJ3990][SDOI2015]排序(DFS)
3990: [SDOI2015]排序 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 902 Solved: 463[Submit][Status][ ...
- Bzoj3990 [SDOI2015]排序
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 651 Solved: 338 Description 小A有一个1-2^N的排列A[1..2^N], ...
- BZOJ3990:[SDOI2015]排序——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3990 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作 ...
- [bzoj3990][SDOI2015]排序-搜索
Brief Description 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1<=i<= ...
- [SDOI2015][bzoj3990] 序列 [搜索]
题面 传送门 思路 首先,这道题目有一个非常显然(但是我不会严格证明,只能意会一下)的结论:一个合法的操作序列中,任意两个操作是可以互换的 那么,这个结论加上本题极小的数据范围,为什么不搜索一下呢? ...
- BZOJ3990 排序(sort)
排序(sort) 题目描述 小A有一个1~2N的排列A[1..2N],他希望将数组A从小到大排序.小A可以执行的操作有N种,每种操作最多可以执行一次.对于所有的i(1<=i<=N),第i种 ...
- BZOJ3990 [SDOI2015]排序 【搜索】
题目 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1<=i<=N),第i中操作为将序列从左到 ...
- BZOJ3990 排序
题目:www.lydsy.com/JudgeOnline/problem.php?id=3990 这题很不错. 刚开始时无从下手,想了好多$O((2^n)log(2^n))$ 的idea,但是都不行. ...
- [BZOJ3990]:[SDOI2015]排序(搜索)
题目传送门 题目描述 小A有一个1-${2}^{N}$的排列A[1..${2}^{N}$],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1≤i≤N), ...
随机推荐
- k8s之configmap和secret
1.configmap configmap和secret是两种特殊的存储卷,它们不是给pod提供存储空间用的,而是给管理员或者用户提供了从外部向pod内部注入信息的方式. configmap:把配置文 ...
- LeetCode面试常见100题( TOP 100 Liked Questions)
LeetCode面试常见100题( TOP 100 Liked Questions) 置顶 2018年07月16日 11:25:22 lanyu_01 阅读数 9704更多 分类专栏: 面试编程题真题 ...
- C++入门基础知识(二)
一:引用 概念:是给一个已经存在的变量取一个别名,编译器不会为引用变量开辟内存空间,它和引用的变量公用一块内存空间. 例如: 类型& 引用变量名(对象名)= 引用实体 int& a = ...
- 解决 Ubuntu 19 安装openjdk 8后与openjfx不兼容
小淘气放假了,孩子在上幼儿园的小朋友,报班也不能太变态嘛, 还是让他自己娱乐的时间多一点,但是现在在家的娱乐就是看电视,听说电视看多了越看越傻,就想方设法的给他找一点娱乐活动,把我闲置的树莓派给他装了 ...
- cookie以一个或多个空格开头
作为一个整体,如果cookie以一个或多个空格开头,请用空格替换所有空格:如果cookie以一个或多个空格结尾,请用空格替换所有空格. 象征意义: \ S:空间,空间 +一个或多个 ^开始,^s,以空 ...
- HTML的学习2(注释)
<!--链接标签--> <!--核心属性就是href 属性值可以是一个跳转的地址--> <a href="">可点击的文本</a> ...
- uni app以及小程序 --环境搭建以及编辑器
https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html 根据以上网页下载自己电脑相应的版本的微信开发者工具(目录 ...
- Mac EI 10.11.3 MySQL5.7.11 .dmg 安装(便捷设置,密码重置,卸载)
MySQL 5.7+ 安装成功以后会弹出一个临时密码 后面需要通过临时密码设置新的密码 重置root密码:安装成功后,使用临时密码登陆:敲入命令,mysqladmin -u root -p passw ...
- vue+axios请求头封装
import { mapMutations } from 'vuex' import axios from 'axios' import { Toast } from 'mint-ui'; impor ...
- 通俗讲解python__new__()方法
目录 通俗讲解python__new__()方法 引子: 小结: 通俗讲解python__new__()方法 转载于别人的博客https://blog.csdn.net/sj2050/article/ ...