BZOJ1330 : Editing a Book
注意到答案不超过$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的更多相关文章
- 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 ...
- 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 ...
- Poisson Image Editing
说起泊松,可以顺便提及一下泊松同学的老师,拉普拉斯.学图像或是信号的,一定对拉普拉斯算子和拉普拉斯卷积很熟悉.在泊松图像融合出现之前,也有一种叫Laplacian pyramid blending的融 ...
- 错误异常 (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 ...
- 【JQGRID DOCUMENTATION】.学习笔记.6.Editing:Common Rules
1 公共编辑属性 要在grid中显示数据的一个关键原因是能简单快速地编辑它.jgGrid提供三种编辑方式: cell editing:编辑指定cell inline editing:编辑同一行的几个c ...
- 【JQGRID DOCUMENTATION】.学习笔记.5.Form Editing
JqGrid支持为view ,add, edit,delete, search创建一个on the fly的form.这使得Modal Boxes和行内编辑能够在程序用结合.毕竟,行内编辑只能用在已经 ...
- UVa 10115 Automatic Editing
字符串题目就先告一段落了,又是在看balabala不知道在说些什么的英语. 算法也很简单,用了几个库函数就搞定了.本来还担心题里说的replace-by为空的特殊情况需要特殊处理,后来发现按一般情况处 ...
- 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 ...
- [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 ...
随机推荐
- Word 2017 快捷键
Ctrl + D: 呼出[字体] Ctrl + S: 进行[保存] Ctrl + F: 呼出[导航] Ctrl + D: 呼出[字体] Ctrl + B: 进行[加粗] Ctrl + G: 呼出[查找 ...
- C++编程命名规则
原文地址:http://www.cnblogs.com/ggjucheng/archive/2011/12/15/2289291.html 如果想要有效的管理一个稍微复杂一点的体系,针对其中事物的一套 ...
- Jenkins中配置selenium测试
Jenkins中配置selenium测试 2015/03/23 第一步在jenkins中配置selenium服务器 第二步工程配置: 第三步:执行构建: 第四步,查看报告:
- C/C++杂记:虚函数的实现的基本原理
1. 概述 简单地说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针.例: 其中: B的虚函数表中存放着B::foo和B ...
- root权限使用vim不能修改权限
1.背景: 有时候我们会发现使用root权限不能修改某个文件,大部分原因是曾经使用chattr将文件锁定了 2.chattr命令介绍: 用来改变文件属性,能防止root用户误删文件等作用 3.使用方法 ...
- javaScript中自定义sort中的比较函数,用于比较字符串长度,数值大小
, 1.2, 'bb', 'cc']; var len = arr.length; // for (var i = 0; i < len; i++) { // alert(arr + &qu ...
- 配置_DruidDataSource参考配置
配置_DruidDataSource参考配置 <!-- 数据库驱动 --> <property name="driverClassName" value=&quo ...
- JNI和NDK
作者:十岁的小男孩 QQ:929994365 心之安处即是吾乡 前言 本文试图通过解答以下三个问题来达到学习JNI和NDK的目的.是什么?有什么用?怎么用?文章内容前三节来自下面第一个链接的博主共享, ...
- poj1195二维树状数组模板
二维树状数组和一维的也差不多,改一下add和query函数即可:即按行修改,行内单点修改即可 /* 二维树状数组,询问一个二维区间内的数之和 */ #include<iostream> # ...
- hdu 1879 有的边已存在 (MST)
Sample Input31 2 1 0 //u v w 是否已建 1 3 2 02 3 4 031 2 1 01 3 2 02 3 4 131 2 1 01 3 2 12 3 4 10 Sample ...