博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ.3990.[SDOI2015]排序(DFS)
阅读量:5023 次
发布时间:2019-06-12

本文共 1799 字,大约阅读时间需要 5 分钟。

操作序列的顺序显然是无关的,所以只需按特定顺序求出一个长度为\(l\)的操作序列,它对答案的贡献为\(l!\)

我们从小到大枚举所有选择。若当前为第\(i\)个,如果有一段长度为\(2^i\)不是+1+1这样递增的,那么需要把它分为两段长度为\(2^{i-1}\)的然后交换(在此之前满足所有长度更小的如\(2^{i-1}\)递增)。
如果有两段长度为\(2^i\)的非每次加1的递增段,会有四种情况,如\(3,8,\cdots,7,4\)(也可能无解:\(8,3,\cdots,7,4\)),即把这两段分成四段长度为\(2^{i-1}\)的,然后枚举四种情况(只会有两种可行方案吧)交换,如果可行下一层DFS。
如果多于两段,不可能有解。
如果没有,那不能交换,下一层。

//836kb 164ms (BZOJ怎么也那么多0ms。。)#include 
#include
#include
#define gc() getchar()const int N=(1<<12)+3;int n,A[N],fac[15],bit[15];long long Ans;inline int read(){ int now=0;register char c=gc(); for(;!isdigit(c);c=gc()); for(;isdigit(c);now=now*10+c-'0',c=gc()); return now;}bool Check(int p,int k){ for(int i=p; i
n) Ans+=fac[cnt]; else { int p1=0,p2=0; for(int i=1; i<=bit[n]; i+=bit[p]) if(!Check(i,bit[p])){ if(!p1) p1=i; else if(!p2) p2=i; else return; } if(!p1&&!p2) DFS(p+1,cnt); else if(p1&&!p2) Swap(p1,p1+bit[p-1],bit[p-1]), DFS(p+1,cnt+1), Swap(p1,p1+bit[p-1],bit[p-1]); else { for(int i=0; i<=1; ++i) for(int j=0; j<=1; ++j) { Swap(p1+i*bit[p-1],p2+j*bit[p-1],bit[p-1]); if(Check(p1,bit[p])&&Check(p2,bit[p]))//两个位置! { DFS(p+1,cnt+1); Swap(p1+i*bit[p-1],p2+j*bit[p-1],bit[p-1]); break; } Swap(p1+i*bit[p-1],p2+j*bit[p-1],bit[p-1]); } } }}int main(){ fac[0]=fac[1]=1; for(int i=2; i<=12; ++i) fac[i]=fac[i-1]*i; for(int i=0; i<=12; ++i) bit[i]=1<

转载于:https://www.cnblogs.com/SovietPower/p/8690972.html

你可能感兴趣的文章
1.在数组中找到与给定总和的配对
查看>>
树的子结构
查看>>
关于根据Build Platform或者OS 加载x86或者x64 dll的问题
查看>>
程序员高效开发的几个技巧
查看>>
js-权威指南学习笔记19.2
查看>>
hexo 搭建博客
查看>>
关于 UIWebView 几个高级用法
查看>>
maven创建的项目中无法创建src/main/java 解决方案
查看>>
华为软件开发云测评报告二:代码检查
查看>>
集合1
查看>>
js 原生 ajax
查看>>
关键词 virtual
查看>>
建造者模式(屌丝专用)
查看>>
UVALive 4730 Kingdom +段树和支票托收
查看>>
[APIO2010]特别行动队
查看>>
[SCOI2016]幸运数字
查看>>
SpringBoot 集成ehcache
查看>>
初步swift语言学习笔记2(可选类型?和隐式可选类型!)
查看>>
Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
查看>>
在Vs2012 中使用SQL Server 2012 Express LocalDB打开Sqlserver2012数据库
查看>>