BZOJ3990:[SDOI2015]排序——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3990
小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认为两个操作序列不同,当且仅当操作个数不同,或者至少一个操作不同(种类不同或者操作位置不同).
下面是一个操作事例:
N=3,A[1..8]=[3,6,1,2,7,8,5,4].
第一次操作,执行第3种操作,交换A[1..4]和A[5..8],交换后的A[1..8]为[7,8,5,4,3,6,1,2].
第二次操作,执行第1种操作,交换A[3]和A[5],交换后的A[1..8]为[7,8,3,4,5,6,1,2].
第三次操作,执行第2中操作,交换A[1..2]和A[7..8],交换后的A[1..8]为[1,2,3,4,5,6,7,8].
考虑暴力怎么写……不会啊。
我们能知道实际上操作顺序不影响结果,于是我们大可以从1~n枚举操作做。
因为最终变得有序,所以我们可以对于每一“大块”查询是否已经排好序了,如果没排好,就说明这一“大块”里的两小块肯定是放错位置的。
如果这样的小块<=4的话我们还好办,显然是前一“大块”的其中一“小块”和后一“大块”的其中一“小块”交换位置。
如果<=2那么就这两块交换就行了。
如果>4我们就处理不了了。
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=<<;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
int n,m,a[N];
ll jc[N],ans;
bool pan(int l,int r){
for(int i=l;i<r;i++)
if(a[i]+!=a[i+])return ;
return ;
}
void mdy(int l,int r,int k){
for(int i=l,j=r;i<l+(<<k);i++,j++)
swap(a[i],a[j]);
}
void dfs(int l,int num){
if(l>n){
ans+=jc[num];
return;
}
int tmp[],tot=;
for(int i=;i<=m;i+=(<<l))
if(!pan(i,i+(<<l)-)){
tmp[++tot]=i;
if(tot>)return;
}
if(!tot){dfs(l+,num);return;}
else if(tot==){
mdy(tmp[],tmp[]+(<<l-),l-);
if(pan(tmp[],tmp[]+(<<l-)))dfs(l+,num+);
mdy(tmp[],tmp[]+(<<l-),l-);
}else{
for(int i=;i<=;i++)
for(int j=;j<=;j++){
mdy(tmp[]+(i<<(l-)),tmp[]+(j<<(l-)),l-);
if(pan(tmp[],tmp[]+(<<l-))&&
pan(tmp[],tmp[]+(<<l-)))dfs(l+,num+);
mdy(tmp[]+(i<<(l-)),tmp[]+(j<<(l-)),l-);
}
}
}
int main(){
n=read(),m=<<n;
jc[]=;for(int i=;i<=n;i++)jc[i]=jc[i-]*i;
for(int i=;i<=m;i++)a[i]=read();
dfs(,);
printf("%lld\n",ans);
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
BZOJ3990:[SDOI2015]排序——题解的更多相关文章
- [BZOJ3990][SDOI2015]排序(DFS)
3990: [SDOI2015]排序 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 902 Solved: 463[Submit][Status][ ...
- BZOJ3990 [SDOI2015]排序 【搜索】
题目 小A有一个1-2^N的排列A[1..2^N],他希望将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), ...
- [SDOI2015]排序 题解 (搜索)
Description 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1<=i<=N),第i中 ...
- Bzoj3990 [SDOI2015]排序
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 651 Solved: 338 Description 小A有一个1-2^N的排列A[1..2^N], ...
- [bzoj3990][SDOI2015]排序-搜索
Brief Description 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1<=i<= ...
- 【LG3322】[SDOI2015]排序
[LG3322][SDOI2015]排序 题面 洛谷 题解 交换顺序显然不影响答案,所以每种本质不同的方案就给答案贡献次数的阶乘. 从小往大的交换每次至多\(4\)中决策,复杂度\(O(4^n)\). ...
- BZOJ 3990: [SDOI2015]排序 [搜索]
3990: [SDOI2015]排序 题意:\(2^n\)的一个排列,给你n种操作,第i种把每\(2^{i-1}\)个数看成一段,交换任意两段.问是这个序列有序的操作方案数,两个操作序列不同,当且仅当 ...
- BZOJ 3990: [SDOI2015]排序(搜索+剪枝)
[SDOI2015]排序 Description 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1< ...
随机推荐
- Linux 下获取本机IP
http://blog.csdn.net/K346K346/article/details/48231933 int main () { /* struct ifaddrs *ifap, *ifa; ...
- ShimmerTextView
本文来自网易云社区 作者:孙有军 产品中有一个需求,要求TextView的文字有一个高亮的效果,高亮的同时有跑马灯效果! 本来想在网上找一个现成的用用,比如Facebook出的Shimmer,还有很多 ...
- join_tab计算代价
此路不通,还是需要按照顺序进行计算
- 使用git bash编译安装sysbench时遇到的坑
Preface When I was compiling the sysbench just now,I encountered some failures in the preced ...
- Python Road
引子 雁离群兮不知所归,路遥远兮吾将何往 Python Road[第一篇]:Python简介 Python Road[第二篇]:Python基本数据类型 Python Road[第三篇]:Pyth ...
- jmeter3.0 java请求
1.java请求说明 需要压测某些java方法或一些请求需要通过编写代码实现 1.1.依赖jar包: jmeter下/lib/ext中的ApacheJMeter_java.jar(必须).Apache ...
- 第三模块:面向对象&网络编程基础 第2章 网络编程
01-计算机基础 02-什么是网络 03-五层协议详解 04-传输层详解 05-什么是Socket 06-基于socket实现简单套接字通信 07-在简单套接字基础上加上通信循环 08-客户端与服务端 ...
- TPO-12 C1 Revise a Hemingway paper
TPO-12 C1 Revise a Hemingway paper 第 1 段 1.Listen to a conversation between a student and a professo ...
- HDU 1394Minimum Inversion Number
The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that ...
- 初步了解CUDA(零)
初步了解CUDA,从历史开始,先不开发: