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. POJ_2769同余问题

    Reduced ID Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9310   Accepted: 374 ...

  2. HDU--1164

    Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  3. 浅尝辄止WPF自定义用户控件(实现颜色调制器)

    主要利用用户控件实现一个自定义的颜色调制控件,实现一个小小的功能,具体实现界面如下. 首先自己新建一个wpf的用户控件类,我就放在我的wpf项目的一个文件夹下面,因为是一个很小的东西,所以就没有用mv ...

  4. Centos7网络配置-转载

    一. 查看网络地址: centos7取消了ifconfig命令,使用ip addr命令查看IP地址 二.配置网络 用VirtualBox安装的CentOS7,安装完成后,发现无法上网,于是到网上查了一 ...

  5. Linux中git的使用

    之前在windows中一直采用github的桌面版,库的建立更新都是借助软件的帮助.所使用的的功能也非常局限,仅仅只是创建库再提交自己的代码.至于版本管理.回滚.分支以及git的结构都没有清楚的认识. ...

  6. dede 内容页文章标题显示不全的更改方法

    找到include/taglib/arclist.lib.php 1.$titlelen = AttDef($titlelen,30);换成$titlelen = AttDef($titlelen,2 ...

  7. ecshop_添加最新评论

    第一步: 在includes/lib_goods.php里面构建自定义函数 代码如下: /**  * 获取最近评论 *  * @return array  */ function get_latest ...

  8. Jquery实现两级联动

    最后结果如下: 关键代码如下: <select name="customerCondition['credibilityBegin']" id="credibili ...

  9. mybatis配置多个数据源事务(Transaction)处理

    当mybatis配置文件中只有一个数据源的时候,按照正常的事务注解形式@Transaction是没有问题的,但是当配置文件中有多个数据源的时候发现事务不起作用了,怎么解决这个问题呢?看下面的案例:

  10. python3 第十章 - 如何进行进制转化

    在计算机的世界里,2进制是主流,而在人类的自然世界中,10进制是主流,那么在这之间必然就会存在进制转化的问题.本章我们就来谈谈进制转化,也希望通过本章加深您对前些章所学知识的理解. 原理:先说说关于位 ...