【搜索】BZOJ 3990: 【Sdoi 2015】排序
3990: [SDOI2015]排序
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 336 Solved: 164
[Submit][Status][Discuss]
Description
小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
7 8 5 6 1 2 4 3
Sample Output
如果没有这样的段,就不需要执行这个操作
如果有一个这样的段,判断将这个段的前半部分和后半部分交换后是否连续递增,如果是就交换然后继续DFS
如果有两个这样的段,判断四种交换情况然后DFS
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath> using namespace std; int a[],n; long long fac[],ans=; void init(){fac[]=;for(int i=;i<=n;i++)fac[i]=fac[i-]*i;} int read()
{
int x=;char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
return x;
} void swap(int x,int y,int nu)
{
for(int i=x,j=y,nn=;nn<nu;nn++)
swap(a[i+nn],a[j+nn]);
} void DFS(int dep,int sco)
{
if(dep==n)
{
ans+=fac[sco];
return;
}
int temp=<<(dep+),stack[]={,,,},top=;
for(int i=;i<(<<n);i+=temp)
{
if(a[i+(temp>>)-]+!=a[i+(temp>>)])stack[++top]=i+(temp>>)-;
if(top>)return;
}
if(top==)
{
DFS(dep+,sco);
return;
}
else if(top==)
{
if(a[stack[]-(temp>>)+]!=a[stack[]+(temp>>)]+)return;
swap(stack[top]-(temp>>)+,stack[top]+,temp>>);
DFS(dep+,sco+);
swap(stack[top]-(temp>>)+,stack[top]+,temp>>);
return;
}
else
{
if(a[stack[]]+==a[stack[]+]&&a[stack[]]+==a[stack[]+])
{
swap(stack[]-(temp>>)+,stack[]-(temp>>)+,temp>>);
DFS(dep+,sco+);
swap(stack[]-(temp>>)+,stack[]-(temp>>)+,temp>>);
swap(stack[]+,stack[]+,temp>>);
DFS(dep+,sco+);
swap(stack[]+,stack[]+,temp>>);
}
else if(a[stack[]]+==a[stack[]-(temp>>)+]&&a[stack[]+(temp>>)]+==a[stack[]+])
{
swap(stack[]+,stack[]-(temp>>)+,temp>>);
DFS(dep+,sco+);
swap(stack[]+,stack[]-(temp>>)+,temp>>);
}
else if(a[stack[]]+==a[stack[]-(temp>>)+]&&a[stack[]+(temp>>)]+==a[stack[]+])
{
swap(stack[]+,stack[]-(temp>>)+,temp>>);
DFS(dep+,sco+);
swap(stack[]+,stack[]-(temp>>)+,temp>>);
}
return;
}
} int main()
{
n=read();
init();
for(int i=;i<=(<<n);i++)
a[i]=read();
DFS(,);
printf("%lld",ans);
return ;
}
【搜索】BZOJ 3990: 【Sdoi 2015】排序的更多相关文章
- BZOJ 3990 [SDOI 2015] 排序 解题报告
这个题哎呀...细节超级多... 首先,我猜了一个结论.如果有一种排序方案是可行的,假设这个方案是 $S$ . 那么我们把 $S$ 给任意重新排列之后,也必然可以构造出一组合法方案来. 于是我们就可以 ...
- [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)
[BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...
- BZOJ 3990: [SDOI2015]排序(搜索+剪枝)
[SDOI2015]排序 Description 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1< ...
- BZOJ 3992 [SDOI 2015] 序列统计 解题报告
这个题最暴力的搞法就是这样的: 设 $Dp[i][j]$ 为前 $i$ 个数乘积为 $j$ 的方案数. 转移的话就不多说了哈... 当前复杂度 $O(nm^2)$ 注意到,$M$ 是个质数,就说明 $ ...
- BZOJ 3993 [SDOI 2015] 星际战争 解题报告
首先我们可以二分答案. 假设当前二分出来的答案是 $Ans$ ,那么我们考虑用网络流检验: 设武器为 $X$,第 $i$ 个武器的攻击力为 $B_i$: 设机器人为 $Y$,第 $i$ 个机器人的装甲 ...
- [BZOJ 3992] [SDOI 2015] 序列统计
Description 传送门 Solution [一] 设 \(f[i][j]\) 表示前 \(i\) 个数的乘积在模 \(p\) 意义下等于 \(j\) 的方案数,有 \[ f[i][j]=\su ...
- Mobius反演与积性函数前缀和演学习笔记 BZOJ 4176 Lucas的数论 SDOI 2015 约数个数和
下文中所有讨论都在数论函数范围内开展. 数论函数指的是定义域为正整数域, 且值域为复数域的函数. 数论意义下的和式处理技巧 因子 \[ \sum_{d | n} a_d = \sum_{d | n} ...
- [BZOJ 1879][SDOI 2009]Bill的挑战 题解(状压DP)
[BZOJ 1879][SDOI 2009]Bill的挑战 Description Solution 1.考虑状压的方式. 方案1:如果我们把每一个字符串压起来,用一个布尔数组表示与每一个字母的匹配关 ...
- [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机
[LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机 题意 给定平面上的 \(n\) 个整点 \((x_i,y_i)\), 一共有两个问题. 第一个问题是从原 ...
- [LOJ 2133][UOJ 131][BZOJ 4199][NOI 2015]品酒大会
[LOJ 2133][UOJ 131][BZOJ 4199][NOI 2015]品酒大会 题意 给定一个长度为 \(n\) 的字符串 \(s\), 对于所有 \(r\in[1,n]\) 求出 \(s\ ...
随机推荐
- Linux 命令 - find: 搜索文件
find 命令可以依据文件的各种属性在既定的目录(及其子目录)里搜索文件. 命令格式 find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [e ...
- JavaScript之表格修改
讲到表格,我们不免都了解它的属性及用途. colspan跨列(纵向的)和rowspan跨行(横向的). 表格中<tr></tr>标签标示行标签:<td></t ...
- 检测SqlServer服务器CPU是否瓶颈
初次写博文,分享个人心得,欢迎大虾小虾来拍砖. 系统自带的性能监视器 在开始命令框中输入perfmon按enter键即可打开性能监视器 可以通过监视 % Processor Time 的值察看cpu是 ...
- sqlserver 测试sql语句执行时间
查看sql语句执行时间/测试sql语句性能 写程序的人,往往需要分析所写的SQL语句是否已经优化过了,服务器的响应时间有多快,这个时候就需要用到SQL的STATISTICS状态值来查看了. 通过设置S ...
- 过程式编程 drawShapes
// // main.m // 3.2.1 过程式编程 #import <Foundation/Foundation.h> typedef enum { kCircle, kRectang ...
- C#事件解析
事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂.而这些东西却往往又是编程中常用且非常重要的东西.大家都知道windows消息处理机制的重要,其实C#事件就是基于window ...
- 使用Mybatis Generator 生产 AS400中的数据表对象
第一次使用Mybatis,由于公司核心服务器是AS400,参考了网络各个大大的教程后,发现无法使用Mybatis Generator自动生成AS400中的表对象 参考URL: http://www.c ...
- thinkphp 前后版本ajaxReturn方法的分别
之前用的是thinkphp2的版本现在改到thinkphp3.2已上的版本,发现ajaxReturn这个方法返回的数据不一样了,现在做下记录 thinkphp2的ajaxReturn的实现原码 pro ...
- winform 与 html 交互 简单案例
本文主要简单的记录winform如何与html文件中的信息如何进行交互,即在winform中加载html界面,从而可以进行相互调用. 1.新建一个winform项目,若要在winform中加载html ...
- 非关系型数据库SequoiaDB虚拟机下应用初探
SequoiaDB是广州巨杉软件有限公司开发的一款新型分布式非关系型数据库.可应用于linux操作系统下.在虚拟机下试用了一下(操作系统Ubuntu),感觉不错,操控简单易上手,在此分享一下心得. 下 ...