插头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的更多相关文章

  1. ZOJ 3256 Tour in the Castle 插头DP 矩阵乘法

    题解 这题是一道非常好的插头题,与一般的按格转移的题目不同,由于m很大,要矩阵乘法,这题需要你做一个按列转移的插头DP. 按列转移多少与按格转移不同,但大体上还是基于连通性进行转移.每一列只有右插头是 ...

  2. 插头DP专题

    建议入门的人先看cd琦的<基于连通性状态压缩的动态规划问题>.事半功倍. 插头DP其实是比较久以前听说的一个东西,当初是水了几道水题,最近打算温习一下,顺便看下能否入门之类. 插头DP建议 ...

  3. DP:0

    小故事: A * "1+1+1+1+1+1+1+1 =?" * A : "上面等式的值是多少" B : *计算* "8!" A *在上面等式 ...

  4. Castle Core 4.0.0 alpha001发布

    时隔一年多以后Castle 项目又开始活跃,最近刚发布了Castle Core 4.0.0 的alpha版本, https://github.com/castleproject/Core/releas ...

  5. 对Castle Windsor的Resolve方法的解析时new对象的探讨

    依赖注入框架Castle Windsor从容器里解析一个实例时(也就是调用Resolve方法),是通过调用待解析对象的构造函数new一个对象并返回,那么问题是:它是调用哪个构造函数呢? 无参的构造函数 ...

  6. AOP之Castle DynamicProxy 动态代理

    这里主要介绍使用castle这个动态代理,在.net一些开源的框架里可以找到它的影子,就连微软的rchard也是使用这个进行方法拦截等可以基于这个进行方法拦截,在这个方面PostSharp算是比较好用 ...

  7. ASP.NET Core 整合Autofac和Castle实现自动AOP拦截

    前言: 除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninject和Castle). 1.ASP ...

  8. POJ 1637 Sightseeing tour

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9276   Accepted: 3924 ...

  9. Euler Tour Tree与dynamic connectivity

    Euler Tour Tree最大的优点就是可以方便的维护子树信息,这点LCT是做不到的.为什么要维护子树信息呢..?我们可以用来做fully dynamic connectivity(online) ...

随机推荐

  1. DeepLearning.ai学习笔记汇总

    第一章 神经网络与深度学习(Neural Network & Deeplearning) DeepLearning.ai学习笔记(一)神经网络和深度学习--Week3浅层神经网络 DeepLe ...

  2. BZOJ4817 SDOI2017 相关分析

    4821: [Sdoi2017]相关分析 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special Judge Description Frank对天文 ...

  3. iptables 命令详解

    转载:http://blog.chinaunix.net/uid-26495963-id-3279216.html 一:前言 防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件 ...

  4. php示例的错误记录

    最近几天在测试php的mvc,从网上找到几个示例. 先学习这一篇,http://www.cnblogs.com/q1ng/p/4529496.html 标题是  PHP的MVC框架 深入解析,其实是最 ...

  5. sql server 2012 新知识-序列

    今天聊一聊sql 2012 上的新功能-----序列 按我的理解,它就是为了实现全局性的唯一标识,按sql server 以前的版本,想对一张表标识很简单,比如identity,但如果要对某几张有业务 ...

  6. python (5分钟实现一个游戏的屏蔽敏感字系统,)

    import datetime time=datetime.datetime.now() dirty= ['fuck','狗日的','犊子','麻批','仙人板板','R你妈','操你','草你',' ...

  7. centos7 系统安装问题汇总

    centos7 系统安装问题汇总: 1.使用u盘 安装centos7时,一直提示:'.../dev/root  does not exist,could not boot' 解决方法: 2.不能将原来 ...

  8. VOOC还真算是OPPO的核心技术

    经常电视看到OPPO打广告说它的VOOC,觉得好奇怪,就一个手机充电讲个不完,尽是骗3.4线城市的人,不过今天研究了一下,还VOOC真算是它的核心技术了. 现在选手机,电池和充电速度是非常重要的,首先 ...

  9. 关于HTTP协议头域详解

    HTTP1.1 请求头:消息头  Accept:text/html,image/*  告诉服务器,客户机支持的数据类型 Accept-Charset:ISO-8859-1  告诉服务器,客户机采用的编 ...

  10. C语言--解引用

    昨天,在<C和指针>上面看到"解引用"这个名词,就好奇的去查了查. (下面是一个大一渣渣的理解,请各位朋友海涵,如果有漏洞或者补充希望前辈不吝指正.) 例: #incl ...