注意到答案不超过$5$,因此可以考虑BFS求出距离起始态或者终止态不超过$2$的所有状态。

设它们到起始态、终止态的距离分别为$f[S],g[S]$,则$ans=\min(5,f[S]+g[S])$。

时间复杂度$O(n^6\log(n!))$。

#include<cstdio>
#include<algorithm>
using namespace std;
typedef unsigned long long ll;
const int N=12,M=363000;
int n,i,j,k,a[N],len[N],S,x,z,v[M],g[M],h,t,q[M],ans;ll f[N][M];
inline ll encode(){
ll t=0;
for(int i=0;i<n;i++)t=t<<4|a[i];
return t;
}
inline int getid(ll x){
int l=0,r=len[n]-1;
while(l<=r){
int mid=(l+r)>>1;
if(f[n][mid]==x)return mid;
if(f[n][mid]<x)l=mid+1;else r=mid-1;
}
}
inline void ext(int x){
if(~v[x])return;
v[q[++t]=x]=z;
}
int main(){
for(n=2;n<=9;n++){
for(i=0;i<n;i++)a[i]=i;
do{f[n][len[n]++]=encode();}while(next_permutation(a,a+n));
sort(f[n],f[n]+len[n]);
}
while(~scanf("%d",&n)){
if(!n)return 0;
for(i=0;i<n;i++)scanf("%d",&a[i]),a[i]--;
if(n==1){puts("0");continue;}
S=getid(encode());
h=1,t=0;
for(i=0;i<len[n];i++)v[i]=-1;
z=0;
ext(S);
while(h<=t){
z=v[x=q[h++]]+1;
if(z>2)continue;
ll O=f[n][x];
for(i=1;i<n;i++)for(j=i;j<n;j++){
ll U=(1ULL<<((j-i+2)*4))-1,F=O;
int L=(j-i+1)*4;
for(k=4*(i-1);k>=0;k-=4){
ll A=(F>>k)&U;
F^=(A^((A>>4)|(A&15)<<L))<<k;
ext(getid(F));
}
}
}
for(i=0;i<len[n];i++)g[i]=v[i],v[i]=-1;
h=1,t=z=0;
ext(0);
while(h<=t){
z=v[x=q[h++]]+1;
if(z>2)continue;
ll O=f[n][x];
for(i=1;i<n;i++)for(j=i;j<n;j++){
ll U=(1ULL<<((j-i+2)*4))-1,F=O;
int L=(j-i+1)*4;
for(k=4*(i-1);k>=0;k-=4){
ll A=(F>>k)&U;
F^=(A^((A>>4)|(A&15)<<L))<<k;
ext(getid(F));
}
}
}
for(ans=5,i=0;i<len[n];i++)if(~v[i]&&~g[i])ans=min(ans,v[i]+g[i]);
printf("%d\n",ans);
}
return 0;
}

  

BZOJ1330 : Editing a Book的更多相关文章

  1. vim - save current file with a new name but keep editing current file

    http://superuser.com/questions/414110/vim-save-a-file-as-a-different-filename-but-keep-w-as-the-curr ...

  2. Simultaneous Tag Editing in IntelliJ IDEA 14.1

    If you're involved in web development and, for some reason, you haven't given a ride to IntelliJ IDE ...

  3. Poisson Image Editing

    说起泊松,可以顺便提及一下泊松同学的老师,拉普拉斯.学图像或是信号的,一定对拉普拉斯算子和拉普拉斯卷积很熟悉.在泊松图像融合出现之前,也有一种叫Laplacian pyramid blending的融 ...

  4. 错误异常 (1)Android Studio错误提示:Gradle project sync failed. Basic functionality (eg. editing, debugging) will not work properly

    [已解决]Android Studio错误提示:Gradle project sync failed. Basic functionality (eg. editing, debugging) wil ...

  5. 【JQGRID DOCUMENTATION】.学习笔记.6.Editing:Common Rules

    1 公共编辑属性 要在grid中显示数据的一个关键原因是能简单快速地编辑它.jgGrid提供三种编辑方式: cell editing:编辑指定cell inline editing:编辑同一行的几个c ...

  6. 【JQGRID DOCUMENTATION】.学习笔记.5.Form Editing

    JqGrid支持为view ,add, edit,delete, search创建一个on the fly的form.这使得Modal Boxes和行内编辑能够在程序用结合.毕竟,行内编辑只能用在已经 ...

  7. UVa 10115 Automatic Editing

    字符串题目就先告一段落了,又是在看balabala不知道在说些什么的英语. 算法也很简单,用了几个库函数就搞定了.本来还担心题里说的replace-by为空的特殊情况需要特殊处理,后来发现按一般情况处 ...

  8. Editing and Deleting Data

    Editing and Deleting Data In the previous chapter we've come to learn how we can use the zend-form a ...

  9. [r]Seven habits of effective text editing

    Seven habits of effective text editing(via) Bram Moolenaar November 2000 If you spend a lot of time ...

随机推荐

  1. odoo - context

    得到整个context self.context_get() self.env['res.users'].context_get() 得到context里面对应的值 eg:得到flag的值 self. ...

  2. saltstack自动化运维系列①之saltstack服务安装及简单使用

    Saltstack介绍 Salt三种运行方式 1.local本地运行2.Master/Minion3.Salt ssh Salt的三大功能 a.远程执行b.配置管理(状态管理)c.云管理:阿里云,aw ...

  3. 如何优雅打印nginx header和body

    场景 参考https://segmentfault.com/a/1190000000606867可以获取response的报文体,由于业务测试有获取响应头Header或响应体Body的需求,这里是通过 ...

  4. Android studio下将项目代码上传至github包括更新,同步,创建依赖

    AS中设置GIT 一.开篇 本文讲如何使用Android Studio将项目上传到github,虽然讲上传github的文章很多,但是大部分都是使用Git Bash命令行,虽然效率高些,但是有点麻烦, ...

  5. java虚拟机内存不足,“Could not create the Java Virtual Machine”问题解决方案

    在运行java程序时,遇到问题"Could not create the Java Virtual Machine."如下截图:

  6. bzoj1150 堆应用,好题

    #include<bits/stdc++.h> using namespace std; #define maxn 100005 #define INF 0x3fffffff #defin ...

  7. 线段树解LIS

    先是nlogn的LIS解法 /* LIS nlogn解法 */ #include<iostream> #include<cstring> #include<cstdio& ...

  8. Java字符串的操作

    判断字符串是否存在 使用str.contains("values") public class one { /*判断某个字符串是否存在*/ public static void m ...

  9. python 全栈开发,Day90(Vue组件,前端开发工具包)

    昨日内容回顾 1. Vue使用 1. 生成Vue实例和DOM中元素绑定 2. app.$el --> 取出该vue实例绑定的DOM标签 3. app.$data --> 取出该vue实例绑 ...

  10. poj 1125 谣言传播 Floyd 模板题

    假如有3个点 点1到点2要5分钟 点1到点3要3分钟 那么5分钟的时间可以传遍全图 所以要先找一个点到其他点的最长时间 再从最长的时间里找出最小值 Sample Input 3 // 结点数2 2 4 ...