BZOJ3990 排序
题目:www.lydsy.com/JudgeOnline/problem.php?id=3990
这题很不错。
刚开始时无从下手,想了好多$O((2^n)log(2^n))$ 的idea,但是都不行。
后来去看题解发现操作序列是满足交换率的,然后竟然是搜索。
因为swap是swap的逆运算(歪歪的)
然后只要从小到大枚举操作序列就可以了。
这样类似分治下去,当你在计算长度为$2^i$的序列时已经保证了所有长度为$2^{i-1}$的序列的「连续且递增」。
注意是「连续且递增」,开始W了好多发,然后推掉重写(开抄) 呜呜。
好像可以证明是$O(n \cdot 2^{2n})$ ?
以后见到这种操作数很小的题目要想想搜索,就算是暴力也可以多拿分。
#include <cstdio>
#include <cstring>
#include <vector> #define LL long long
#define N 13 using namespace std; int n;
LL fact[],ans; void change(vector<int> &x,int l1,int l2,int len){
for(int i=;i<len;i++)
swap(x[l1+i],x[l2+i]);
} bool check(vector<int> x,int l,int len){
for(int i=;i<len;i++)
if(x[l+i]!=x[l+i-]+) return ;
return ;
} void dfs(vector<int> x,int t,int now){
if(t==n){
ans+=fact[now];
return;
}
int tot=,a[];
for(int i=;i<(<<n);i+=(<<(t+)))
if(!check(x,i,<<(t+))){
if(tot==) return;
a[++tot]=i; a[++tot]=i+(<<t);
}
vector<int> b;
if(!tot) dfs(x,t+,now);
if(tot==){
if(x[a[]]+(<<t)==x[a[]]){
b=x;
change(b,a[],a[],<<t);
dfs(b,t+,now+);
}
}
if(tot==){
if(x[a[]]+(<<t)==x[a[]] && x[a[]]+(<<t)==x[a[]]){
b=x;
change(b,a[],a[],<<t);
dfs(b,t+,now+);
}
if(x[a[]]+(<<t)==x[a[]] && x[a[]]+(<<t)==x[a[]]){
b=x;
change(b,a[],a[],<<t);
dfs(b,t+,now+);
}
if(x[a[]]+(<<t)==x[a[]] && x[a[]]+(<<t)==x[a[]]){
b=x;
change(b,a[],a[],<<t);
dfs(b,t+,now+);
}
if(x[a[]]+(<<t)==x[a[]] && x[a[]]+(<<t)==x[a[]]){
b=x;
change(b,a[],a[],<<t);
dfs(b,t+,now+);
}
}
} vector<int> a; int main(){
scanf("%d",&n);
a.resize(<<n);
for(int i=;i<(<<n);i++) scanf("%d",&a[i]);
fact[]=;
for(int i=;i<=;i++) fact[i]=fact[i-]*(LL)i;
dfs(a,,);
printf("%lld\n",ans);
return ;
}
BZOJ3990 排序的更多相关文章
- BZOJ3990 排序(sort)
排序(sort) 题目描述 小A有一个1~2N的排列A[1..2N],他希望将数组A从小到大排序.小A可以执行的操作有N种,每种操作最多可以执行一次.对于所有的i(1<=i<=N),第i种 ...
- 【SDOI2015】bzoj3990 排序
A. 排序 题目描述 输入格式 输出格式 一行,一个整数,表示可以将数组A从小到大排序的不同的操作序列的个数. 样例 样例输入 3 7 8 5 6 1 2 4 3 样例输出 6 数据范围与提示 对于3 ...
- [BZOJ3990][SDOI2015]排序(DFS)
3990: [SDOI2015]排序 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 902 Solved: 463[Submit][Status][ ...
- Bzoj3990 [SDOI2015]排序
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 651 Solved: 338 Description 小A有一个1-2^N的排列A[1..2^N], ...
- BZOJ3990:[SDOI2015]排序——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3990 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作 ...
- [bzoj3990][SDOI2015]排序-搜索
Brief Description 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1<=i<= ...
- 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), ...
- [BZOJ3990][SDOI2015][LOJ#2181]-排序
说实话,这个题真好(?) <BZOJ题面> <LOJ题面> 看到这个题,一时没有思路 但是 我想到了一个错解:归并 这个题真的有一点把我们的思路往归并上引 于是WA10 诶?我 ...
随机推荐
- VS2017不能生成Database Unit Test项目
问题描述: VS2017生成Database Unit Test项目时,报出如下错误,但该项目在VS2015中能正常生成: 主要是因为下面两个程序集找不到引用: Microsoft.Data.Tool ...
- C# 读写bat文件
读: var batFile = "D:\\test.bat"; if (File.Exists(batFile)) { using (var sr = new StreamRea ...
- [Unit Testing] Test async function with Jasmine
Most of time, when we want to test function call inside a promise, we can do: it('Should be async', ...
- Android入门常见问题
前言: 眼下非常多人入门用android studio,可是我觉得这是 一个不好的開始. 一个集成的软件,不用你去部署.那么你就好难去学习究竟层的东西. 以后的问题时.问题所在还是在底层,就像&quo ...
- Eclipse打包Android项目时用到proguard.cfg后,出现的Warning:can't find referenced class问题的解决方式
Warning: can't find superclass or interface Warning: can't find referenced class 这两个问题的解决方法: 1.要把你项目 ...
- 【翻译自mos文章】怎么找到OGG Director Server使用的数据库和username?
APPLIES TO: Management Pack for Oracle GoldenGate - Version: 1.0.0.0 - Release: 1.0 Information in t ...
- 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂
浅谈JS中的!=.== .!==.===的用法和区别 var num = 1; var str = '1'; var test = 1; test == num //tr ...
- windows服务 MVC之@Html.Raw()用法 文件流的读写 简单工厂和工厂模式对比
windows服务 public partial class Service1 : ServiceBase{ System.Threading.Timer recordTimer;public S ...
- codeforces#FF(div2) D DZY Loves Modification
首先要知道选择行列操作时顺序是无关的 用两个数组row[i],col[j]分别表示仅选择i行能得到的最大值和仅选择j列能得到的最大值 这个用优先队列维护,没选择一行(列)后将这行(列)的和减去对应的n ...
- PowerDesigner逆向工程,从SQL Server数据库生成Physical Model
提前声明:这种方式貌似只能是Power Designer安装在数据库服务器的时候才可以,因为我按照成功的这个再去从本机逆向连接远程服务器的时候,一直提示:test failed......不讲了,尴尬 ...