3990: [SDOI2015]排序

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


R1D1T1

先玩一下样例

发现操作的顺序其实没有影响

从小到大考虑,设当前处理的有n段,可以分成\(\frac{n}{2}\)个二元组\((a_i, a_{i+1})\),每个都要满足\(a_i +1 = a_{i+1}\),找出有几个不满足,如果\(\le 2\)个那么枚举如何交换然后再处理\(\frac{n}{2}\)段的时候

注意每种成立的交换就要继续搜索...一开始没这么做然后35分...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=(1<<12) + 5, INF=1e9+5;
inline int read(){
char c=getchar();int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
} int bin, n, t[15][N], fac[N]; ll ans=0;
inline bool check(int *a, int x, int y) {return a[x]+1 == a[x+1] && a[y]+1 == a[y+1];}
inline void ready(int *a, int n) {
for(int i=1; i<=n; i++) a[i] = a[i*2-1]/2 + 1;
}
void dfs(int d, int n, int now) { //printf("dfs %d %d %d\n",d,n,now);
if(d>=bin) {ans += fac[now]; return;}
int *a = t[d], *b = t[d+1];
//for(int i=1; i<=n; i++) printf("%d ",a[i]); puts(" a"); int tot=0, li[5];
for(int i=1; i<=n; i+=2)
if(a[i]+1 != a[i+1]) {li[++tot]=i; if(tot>2) return;} int x=li[1], y=li[2];
if(tot==2) {
swap(a[x], a[y]);
if(check(a, x, y)) memcpy(b, a, sizeof(int)*(n+1)), ready(b, n>>1), dfs(d+1, n>>1, now+1);
swap(a[x], a[y]); swap(a[x], a[y+1]);
if(check(a, x, y)) memcpy(b, a, sizeof(int)*(n+1)), ready(b, n>>1), dfs(d+1, n>>1, now+1);
swap(a[x], a[y+1]); swap(a[x+1], a[y]);
if(check(a, x, y)) memcpy(b, a, sizeof(int)*(n+1)), ready(b, n>>1), dfs(d+1, n>>1, now+1);
swap(a[x+1], a[y]); swap(a[x+1], a[y+1]);
if(check(a, x, y)) memcpy(b, a, sizeof(int)*(n+1)), ready(b, n>>1), dfs(d+1, n>>1, now+1);
swap(a[x+1], a[y+1]);
} else if(tot==0) memcpy(b, a, sizeof(int)*(n+1)), ready(b, n>>1), dfs(d+1, n>>1, now);
else if(tot==1) swap(a[x], a[x+1]), memcpy(b, a, sizeof(int)*(n+1)), ready(b, n>>1), dfs(d+1, n>>1, now+1);
}
int main() {
freopen("in","r",stdin);
bin=read(); n=1<<bin;
fac[0]=1;
for(int i=1; i<=bin; i++) fac[i]=fac[i-1]*i;
for(int i=1; i<=n; i++) t[0][i]=read();
dfs(0, n, 0);
printf("%lld", ans);
}

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

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

    [题目分析] 可以发现,操作的先后顺序是不影响结果的,那么答案就是n!的和. 可以从小的步骤开始搜索,使得每一个当前最小的块都是上升的数列,然后看看是否可行即可. 复杂度好像是4^n [代码](哪里写 ...

  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. Oracle复制表结构及数据

    1. 复制表结构及其数据:  create table table_name_new as select * from table_name_old 2. 只复制表结构:  ; 或者: create ...

  2. 如何在SecureCRT中给linux上传和下载文件 安装redis

    首先建立文件 /download sz和rz命令无法用.则用以下1.和2.3步骤   需要上传或者下载,需要使用rz和sz命令.如果linux上没有这两个命令工具,则需要先安装.可以使用yum安装.运 ...

  3. radiobutton独特属性

    radiobutton是通过name来分组的,也就是说,使用相同的名字的radio,它们才是单选的,如果名字不同的radio,是不具备这个效果的,这个是第一要点. 第二,针对不同的radio(name ...

  4. tp5 $_ENV获取不到数据

    $_ENV变量是取决于服务器的环境变量的,从不同的服务器上获取的$_ENV变量打印出的结果可能是不同的. php的配置文件php.ini的配置项为:variables_order = "GP ...

  5. 搭建mybatis时的小问题

    1.源文件中的xml文件经过编译后没有打包到classes中去,在源文件包中写的mapper文件运行时找不到. 解决办法: pom文件build下添加编译时加入xml和resource文件下的所有文件 ...

  6. Shell中$X的含义

    $0 表示这个程序的执行名字,包含输入参数$n 表示这个程序的第n个参数值$*  表示这个程序的所有参数,此选项参数可超过9个.$#  表示这个程序的参数个数$$  表示这个程序的PID(脚本运行的当 ...

  7. 【编程技巧】EXTJS中Ext.grid.GridPanel配置项autoExpandColumn的使用方法

    autoExpandColumn的作用是自动伸展,占满剩余区域.一般使用在列比较少,并且大多数列都比较窄,有一列比较宽的情况下,当然什么时候使用,还是得按照实际情况确定. 使用的时候主要有三点要注意的 ...

  8. linux 从softnet_stat查看内核丢包信息

    1.从系统整体来考虑,通过netstat 查看: [root@localhost net]# netstat -s |grep drop 3168 outgoing packets dropped 1 ...

  9. 从(0,0)到(m,n),每次走一步,只能向上或者向右走,有多少种路径走到(m,n)

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  10. Javascript学习--时间

    digit = [ [ [0,0,1,1,1,0,0], [0,1,1,0,1,1,0], [1,1,0,0,0,1,1], [1,1,0,0,0,1,1], [1,1,0,0,0,1,1], [1, ...