[ZOJ3256] Tour in the Castle
插头DP+矩阵乘法
m喜闻乐见地达到了10^9级别。。而n<=7,并且没有障碍。。所以列与列之间的转移时一样的。。就可以上矩乘了。
感觉自己快没救了。。看半天题解还是不懂。。
http://www.cnblogs.com/staginner/archive/2012/09/14/2684712.html 题解其实讲的很清楚了。。
在枚举转移的状态的时候想乱了好几次。。2^n枚举的是有没有右插头,处理新出现路径的姿势也和平时不同。。。
剩下的就是矩乘了。。
#include<cstdio>
#include<iostream>
#include<cstring>
#define ll long long
using namespace std;
const int maxzt=,modd=;
struct zs1{
int last[],tot;
inline int get(int x){
if(last[x])return last[x];
last[x]=++tot,zt[tot]=x;
return tot;
}
int zt[];
}hm;
int mp[];
int a[][],c[][],b[][],map[][][];
int len[];
int i,j,k,n,m,l; inline void decode(int x){
for(int i=n;i>=;i--)mp[i]=x&,x>>=;
}
bool u[];int id[];
inline int encode(){
int i,x=,cnt=;
memset(u,,);
for(i=;i<=n;mp[i]=id[mp[i]],x=x<<|mp[i],i++)
if(!u[mp[i]]&&mp[i]>)u[mp[i]]=,id[mp[i]]=++cnt;
return x;
} inline bool check(int prezt,int nowzt){
int i,up=,left,pre=,sm=n-;bool r;
decode(prezt);
// for(i=1;i<=n;i++)printf(" %d",mp[i]);printf(" %d\n",prezt);
for(i=;i<=n;i++){
r=(nowzt&(<<(i-)))>,left=mp[i];
// printf(" up:%d r:%d l:%d\n",up,r,left);
if((up&&r&&left)||(!up&&!r&&!left))return ;
if(!up){
if(left&&r)continue;
pre=i;
if(!r)up=mp[i];
if(!left)up=-;
}else{
if(left){
if(left==up&&(i<n||nowzt!=))return ;
if(up>){
mp[pre]=mp[i]=;
for(int j=;j<=n;j++)if(mp[j]==left)mp[j]=up;
}else mp[pre]=mp[i],mp[i]=;
}
if(r){
if(up>)mp[i]=up,mp[pre]=;
else mp[i]=mp[pre]=++sm;
}
if(left||r)up=;
}
}
return up==;
}
inline void prerun(){
int i,j,k;
hm.tot=;memset(hm.last,,sizeof(hm.last));
memset(mp,,sizeof(mp));
hm.get(),
mp[]=mp[n]=,hm.get(encode());//printf(" %d\n",encode());
for(i=;i<=hm.tot;i++){//printf(" %d\n",n) ;
int zt=hm.zt[i];decode(zt);
// for(j=1;j<=n;j++)printf(" %d",mp[j]);puts("");
for(j=;j<(<<n);j++)if(check(zt,j))
k=hm.get(encode()),
map[n][i][k]=;//,printf(" %d %d\n",j,k);
}
len[n]=hm.tot;
}
inline void multoa(){
int i;register int j,k;ll tmp;
for(i=;i<=l;i++)for(j=;j<=l;b[i][j]=tmp%modd,j++)
for(tmp=,k=;k<=l;k++)tmp+=(ll)a[i][k]*a[k][j];
for(i=;i<=l;i++)for(j=;j<=l;j++)a[i][j]=b[i][j];
}
inline void multoc(){
int i;register int j,k;ll tmp;
for(i=;i<=l;i++)for(j=;j<=l;b[i][j]=tmp%modd,j++)
for(tmp=,k=;k<=l;k++)tmp+=(ll)a[i][k]*c[k][j];
for(i=;i<=l;i++)for(j=;j<=l;j++)c[i][j]=b[i][j];
}
int main(){
for(i=;i<=;i++)n=i,prerun();//return 233;
while(scanf("%d",&n)!=EOF){
scanf("%d",&m);
if(n==&&m==){
puts("");continue;
}
if((n&)&&!(m&)){
puts("Impossible");continue;
}
memcpy(a,map[n],sizeof(map[n]));l=len[n];
memset(c,,sizeof(c));
for(i=;i<=l;i++)c[i][i]=;
while(m){
if(m&)multoc();
m>>=;if(m)multoa();
}
if(!c[][])puts("Impossible");else printf("%d\n",c[][]);//return 233;
}
return ;
}
发现我的矩乘比标程的慢了不少。。QAQ
本来要跑150ms的。。然后顺手加了对极限数据、无解的特判。。然后直接0ms吓哭...数据竟然这么水= =

[ZOJ3256] Tour in the Castle的更多相关文章
- ZOJ 3256 Tour in the Castle 插头DP 矩阵乘法
题解 这题是一道非常好的插头题,与一般的按格转移的题目不同,由于m很大,要矩阵乘法,这题需要你做一个按列转移的插头DP. 按列转移多少与按格转移不同,但大体上还是基于连通性进行转移.每一列只有右插头是 ...
- 插头DP专题
建议入门的人先看cd琦的<基于连通性状态压缩的动态规划问题>.事半功倍. 插头DP其实是比较久以前听说的一个东西,当初是水了几道水题,最近打算温习一下,顺便看下能否入门之类. 插头DP建议 ...
- DP:0
小故事: A * "1+1+1+1+1+1+1+1 =?" * A : "上面等式的值是多少" B : *计算* "8!" A *在上面等式 ...
- Castle Core 4.0.0 alpha001发布
时隔一年多以后Castle 项目又开始活跃,最近刚发布了Castle Core 4.0.0 的alpha版本, https://github.com/castleproject/Core/releas ...
- 对Castle Windsor的Resolve方法的解析时new对象的探讨
依赖注入框架Castle Windsor从容器里解析一个实例时(也就是调用Resolve方法),是通过调用待解析对象的构造函数new一个对象并返回,那么问题是:它是调用哪个构造函数呢? 无参的构造函数 ...
- AOP之Castle DynamicProxy 动态代理
这里主要介绍使用castle这个动态代理,在.net一些开源的框架里可以找到它的影子,就连微软的rchard也是使用这个进行方法拦截等可以基于这个进行方法拦截,在这个方面PostSharp算是比较好用 ...
- ASP.NET Core 整合Autofac和Castle实现自动AOP拦截
前言: 除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninject和Castle). 1.ASP ...
- POJ 1637 Sightseeing tour
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9276 Accepted: 3924 ...
- Euler Tour Tree与dynamic connectivity
Euler Tour Tree最大的优点就是可以方便的维护子树信息,这点LCT是做不到的.为什么要维护子树信息呢..?我们可以用来做fully dynamic connectivity(online) ...
随机推荐
- 并行rsync
#!/bin/bash ]; then echo -e "usage : \n\t$0 hostList src_file dst_path" echo -e "exam ...
- Inception使用详解
一.Inception简介一款用于MySQL语句的审核的开源工具,不但具备自动化审核功能,同时还具备执行.生成对影响数据的回滚语句功能. 基本架构: 二.Inception安装 1.软件下载 下载链接 ...
- wait/notify 实现多线程交叉备份
一.任务 创建20个线程,其中10个线程是将数据备份到 A 数据库中,另外10 个线程将数据备份到 B 数据库中,并且备份 A 数据库和 备份 B 数据库的是交叉运行的. 二.实现 1.实现备份 A ...
- bzoj 2726: [SDOI2012]任务安排
Description 机 器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的 若干任务.从时刻0开始,这 ...
- eclipse无法识别Web项目的问题
1.如果导入web项目后,eclipse无法将其识别为web项目,因而无法发布到tomcat容器中的话,可以采取以下步骤尝试解决: 选中项目名称并点击右键,选择“Properties”项,在出项的面板 ...
- Linux目录结构介绍-http://yangrong.blog.51cto.com/6945369/1288072
1.树状目录结构图 2./目录 目录 描述 / 第一层次结构的根.整个文件系统层次结构的根目录. /bin/ 需要在单用户模式可用的必要命令(可执行文件):面向所有用户,例如:cat.ls.cp,和/ ...
- find 命令的误差估值与单位调整
一.命令简介 find 命令的 -size 参数 单位b(不是byte而是block).c.w.k.M.G.默认是单位b ,也就是1block = 512byte = 0.5kb (文件系统ext4) ...
- 利用layer实现MVC页面数据互交提示弹框
需求说明: 一个表单页面,点击提交之后,进入后台进行一系列数据交互,然后将交互信息返回至页面中,并以弹框形式展示 应用场景: 添加.修改.删除数据后,返回数据操作是否成功,以及一些其他信息 前期准备: ...
- HashMap与ConcurrentHashMap
从JDK1.2起,就有了HashMap,正如前一篇文章所说,HashMap不是线程安全的,因此多线程操作时需要格外小心. 在JDK1.5中,伟大的Doug Lea给我们带来了concurrent包,从 ...
- 【Java框架型项目从入门到装逼】第四节 - 编写第一个Servlet程序
在开始这一节之前呢,我们还需要把Tomcat配置到Eclipse中,配置的方式很简单,打开Eclipse,Window,Preferences,进入到这个页面: 将Tomcat的安装目录配置到Ecli ...