LOJ2181 排序
目录
- LOJ2181 排序
- 题意
- 题解
- Code:
LOJ2181 排序
题目传送门
题意
小 A 有一个\(1 \sim 2^n\)的排列\(A[1 \dots 2^n]\),他希望将\(A\)数组从小到大排序,小 \(A\) 可以执行的操作有 \(n\) 种,每种操作最多可以执行一次,对于所有的 \(i(1 \leq i \leq n)\),第 \(i\) 种操作为将序列从左到右划分为 \(2^{n-i+ 1}\)段,每段恰好包括2^{i-1}个数,然后整体交换其中两段。小\(A\)想知道可以将数组 \(A\) 从小到大排序的不同的操作序列有多少个,小\(A\)认为两个操作序列不同,当且仅当操作个数不同,或者至少一个操作不同(种类不同或者操作位置不同)。
\((1 \leq n \leq 12)\)
题解
很妙的一个爆搜,由于规定了每一种长度的整体交换只能使用一次,所以我们从小的操作往大的操作做,那么如果能够满足条件,则到达该操作\(i\)的时候,序列分成的长为\(2^{i-1}\)的段一定是递增的,否则就是不符合答案的。然后我们考虑如何处理当前这一层的交换。我们分四种情况:
如果长度为\(2^i\)的段没有非递增的,那么就说明不用交换。
如果只有一段长度为\(2^i\)的段非递增,那么就说明我们就只需要将这一段的前一半和后一半交换即可(因为这两半都是一定保证递增的)。
如果有两段长度为\(2^i\)的段非递增,那么就有四种交换的可能,我们都直接搜下去就行可。
如果有大于两段的\(2^i\)的段非递增,那么说明当前段无法通过一次交换完成,直接return就行了。
由于我们在每一层最多只会做出四次的决策,那么复杂度就是\(O(4^{n})\)。
Code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
bool Finish_read;
template<class T>inline void read(T &x){Finish_read=0;x=0;int f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;if(ch==EOF)return;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;Finish_read=1;}
template<class T>inline void print(T x){if(x/10!=0)print(x/10);putchar(x%10+'0');}
template<class T>inline void writeln(T x){if(x<0)putchar('-');x=abs(x);print(x);putchar('\n');}
template<class T>inline void write(T x){if(x<0)putchar('-');x=abs(x);print(x);}
/*================Header Template==============*/
const int N=1e4+50;
int n,len;
ll ans;
int a[N],block[N];
ll fac[N];
/*==================Define Area================*/
int Judge(int l,int k) {for(int i=1;i<block[k];i++) {if(a[l+i-1]+1!=a[l+i]) return 0;}return 1;
} void Swap(int l,int r,int k) {for(int i=0;i<block[k];i++) swap(a[l+i],a[r+i]);
} void Dfs(int k,int nw) {if(k==n+1) {ans+=fac[nw];return ;}int pos1=0,pos2=0;for(int i=1;i<=len;i+=block[k]) {if(!Judge(i,k)) {if(!pos1) pos1=i;else if(!pos2) pos2=i;else return ;}}if(!pos1&&!pos2) Dfs(k+1,nw);else if(pos1&&!pos2) {Swap(pos1,pos1+block[k-1],k-1);Dfs(k+1,nw+1);Swap(pos1,pos1+block[k-1],k-1);}else {for(int i=0;i<2;i++) {for(int j=0;j<2;j++) {Swap(pos1+i*block[k-1],pos2+j*block[k-1],k-1);if(Judge(pos1,k)&&Judge(pos2,k)) {Dfs(k+1,nw+1);Swap(pos1+i*block[k-1],pos2+j*block[k-1],k-1);break;}Swap(pos1+i*block[k-1],pos2+j*block[k-1],k-1);}}}return ;
}int main() {read(n);block[0]=1,fac[0]=1;for(int i=1;i<=n;i++) block[i]=block[i-1]<<1,fac[i]=fac[i-1]*i;len=1<<n;for(int i=1;i<=len;i++) read(a[i]);Dfs(1,0);printf("%lld\n",ans);return 0;
}
转载于:https://www.cnblogs.com/Apocrypha/p/10224871.html
LOJ2181 排序相关推荐
- 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法
数据库中自定义排序 场景:有一张banner表,表中有一个status字段,有0, 1, 2三个状态位,我想要 1,0,2的自定义排序(这里是重点),然后再进行之上对sequence字段进行二次排序( ...
- 伍六七带你学算法 进阶篇-排序算法
给定一个整数数组 nums,将该数组升序排列. 示例 1: 输入:[5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:[5,1,1,2,0,0] 输出:[0,0,1,1,2,5] 各排序算 ...
- python中排序英文单词怎么写_Python实现对文件进行单词划分并去重排序操作示例...
本文实例讲述了Python实现对文件进行单词划分并去重排序操作.,具体如下: 文件名:test1.txt 文件内容: But soft what light through yonder window ...
- Redis 笔记(07)— sorted set 类型(添加、删除有序集合元素、获取分数范围内成员、按score排序、返回集合元素个数)
zset 可能是 Redis 提供的最为特色的数据结构,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权 ...
- Redis 高级特性(1)—— 事务 过期时间 排序
1. Redis 高级特性 -- 事务 事务概念 Redis 中的事务 (transaction)是一组命令的集合.事务同命令一样是 Redis 的最小执行单位,一个事务中的命令要么都执行,要么都不执 ...
- 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/
大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...
- python 实现桶排序
前言 桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里.每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序).桶排序是鸽 ...
- js数组的排序 sort详解
1.简单数组简单排序 <script type="text/javascript">var arrSimple=new Array(1,8,7,6);arrSimple ...
- java集合中对象某属性比较排序
TreeSet:它可以给Set集合中的元素进行指定方式的排序. 保证元素唯一性的方式:通过比较的结果是否为0. 底层数据结构是:二叉树. 排序的第一种方式: 让元素自身具备比较性.只要让元素实现Com ...
- learning to rank_排序
20210415 ndcg 一个正确结果位置的随机结果是0.45左右 20210412 考察产业匹配MRR评估指标的随机情况是什么样的 随机情况下会是什么样的 可以根据ndcg的值来看是否随机 202 ...
最新文章
- mysql的count(*)的优化,获取千万级数据表的总行数
- Java(静态)变量和(静态)代码块的执行顺序
- scala 方法、函数定义小结
- matlab tsai手眼标定程序代码_标定系列一 | 机器人手眼标定的基础理论分析
- java反编译工具_JDA Java反编译工具的下载和使用手册
- centos php mcrypt_Centos 建议使用epel源
- Android 进程间通信——AIDL
- MySQL学习笔记:一道group by+group_concat解决的小问题
- python项目如何打包_python项目怎么打包运行?
- UCI数据集汇总及描述
- 解决同一办公环境局域网下无法添加打印机的情况
- 基础优化 标题优化 上下架注意事项 流量少 转换率低 加购收藏 店铺层级 动销率 动态评分 当你弄清楚这些,自然流量的起来的重要因素
- Android12 源码下载、编译、刷机、单编调试Framework
- 从飞信,超信看中国通讯行业的不作为
- 访问者模式(Visitor模式)
- 学校计算机教室报损登记本,平阴县中小学功能室管理基本要求
- 交换机堆叠和热备的区别
- 自律给你自由——设计布局的新姿势
- 密码学安全强随机数生成器_强密码学简介
- Inpho.DtMaster.v1.0.0 1CD
热门文章
- 设计了一个JavaScript的源代码混淆器
- iOS 时间格式错误导致的坑
- 7x android 8,内测开启 华为荣耀畅玩7X升级Android 8.0
- Gogs clone仓库地址为localhost
- easyui datagrid添加合计行
- 1000并发的系统服务器配置,1000人并发服务器配置
- No package ‘libpeas-1.0‘ found/No package ‘libpeas-gtk-1.0‘
- 可恨的KYLIN OS:动不动就不支持老机
- Graphics进行局部旋转的办法
- 管理感悟:遇到大事极少数人能处理好