Formula 1

题意

在\(n*m\)的矩阵中,有些格子有树,没有树的格子不能到达,找一条回路,吃完所有的树,求有多少种方法。

解法

因为只要一条回路,所以我们必须维护插头的连通性。

具体的可以参照 这位大佬的博客

代码

注意开long long。

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <cctype>
#define del(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
template <typename T>
inline void read(T &x) {
x=0;char c=getchar();T k=1;
while(!isdigit(c)) {if(c=='-') k=-1;c=getchar();}
while(isdigit(c)) {x=x*10+c-'0';c=getchar();}x*=k;
} const int maxn=15;
const int maxhash=100000;
char G[maxn][maxn];
int _hash[maxhash];
ll sta[2][600000],sum[2][600000];
int cur,n,m,en,em;
int tot[2];
int jz[maxn]; void _init() {
read(n),read(m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) {
cin>>G[i][j];
if(G[i][j]=='.') en=i,em=j;
}
for(int i=1;i<=m;i++) jz[i]=i<<1;
} void hash_insert(ll s,ll data) {
int pos=s%maxhash;
while(_hash[pos]) {
if(sta[cur][_hash[pos]]==s) {
sum[cur][_hash[pos]]+=data;
return;
}
if(++pos==maxhash) pos=0;
}
++tot[cur];
_hash[pos]=tot[cur];
sta[cur][tot[cur]]=s;sum[cur][tot[cur]]=data;
}
ll ans;
void work() {
tot[0]=1;sum[0][1]=1;
for(int i=1;i<=n;i++) {
for(int k=1;k<=tot[cur];k++)
sta[cur][k]=sta[cur][k]<<2;
for(int j=1;j<=m;j++) {
cur^=1;
tot[cur]=0;
del(_hash,0);
del(sta[cur],0);
del(sum[cur],0);
for(int k=1;k<=tot[1-cur];k++) {
ll s=sta[1-cur][k],data=sum[1-cur][k];
int x=(s>>jz[j-1])%4;
int y=(s>>jz[j])%4;
ll temp;
if(G[i][j]!='.') {
if(x==0&&y==0) hash_insert(s,data);
}
else {
if(x==0&&y==0) {
if(G[i][j+1]=='.'&&G[i+1][j]=='.') {
temp=s+1*(1<<jz[j-1])+2*(1<<jz[j]);
hash_insert(temp,data);
}
continue;
}
if(x==0&&y>0) {
if(G[i][j+1]=='.')
hash_insert(s,data);
if(G[i+1][j]=='.') {
temp=s-y*(1<<jz[j])+y*(1<<jz[j-1]);
hash_insert(temp,data);
}
continue;
}
if(x>0&&y==0) {
if(G[i+1][j]=='.')
hash_insert(s,data);
if(G[i][j+1]=='.') {
temp=s-x*(1<<jz[j-1])+x*(1<<jz[j]);
hash_insert(temp,data);
}
continue;
}
if(x==1&&y==1) {
int f=1;
for(int v=j+1;v<=m;v++) {
int fff=(s>>jz[v])%4;
if(fff==1) f++;
if(fff==2) f--;
if(!f) {
temp=s-2*(1<<jz[v])+1*(1<<jz[v]);
break;
}
}
temp=temp-1*(1<<jz[j-1])-1*(1<<jz[j]);
hash_insert(temp,data);
continue;
}
if(x==2&&y==2) {
int f=1;
for(int v=j-2;v>=1;v--) {
int fff=(s>>jz[v])%4;
if(fff==1) f--;
if(fff==2) f++;
if(!f) {
temp=s-1*(1<<jz[v])+2*(1<<jz[v]);
break;
}
}
temp=temp-2*(1<<jz[j-1])-2*(1<<jz[j]);
hash_insert(temp,data);
continue;
}
if(x==2&&y==1) {
temp=s-2*(1<<jz[j-1])-1*(1<<jz[j]);
hash_insert(temp,data);
continue;
}
if(x==1&&y==2) {
if(i==en&&j==em) {
ans+=data;
}
}
}
}
}
}
} int main() {
_init();
work();
printf("%lld\n",ans);
return 0;
}

bzoj 1814 Fornula 1的更多相关文章

  1. bzoj 1814 Ural 1519 Formula 1 插头DP

    1814: Ural 1519 Formula 1 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 942  Solved: 356[Submit][Sta ...

  2. bzoj 1814 Ural 1519 Formula 1 ——插头DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1814 普通的插头 DP .但是调了很久.注意如果合并两个 1 的话,不是 “把向右第一个 2 ...

  3. bzoj 1814: Ural 1519 Formula 1 插头dp经典题

    用的括号序列,听说比较快. 然并不会预处理,只会每回暴力找匹配的括号. #include<iostream> #include<cstdio> #include<cstr ...

  4. bzoj 1814: Ural 1519 Formula 1【插头dp】

    设f[i][j][s]为轮廓线推到格子(i,j),状态为s的方案数 括号表示一段线的左端和右端,表示成左括号和右括号,状压的时候用1和2表示,0表示已经闭合 下面的蓝线是黄色格子的轮廓线,dp转移要把 ...

  5. 插头DP题目泛做(为了对应WYD的课件)

    题目1:BZOJ 1814 URAL 1519 Formula 1 题目大意:给定一个N*M的棋盘,上面有障碍格子.求一个经过所有非障碍格子形成的回路的数量. 插头DP入门题.记录连通分量. #inc ...

  6. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  7. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  8. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  9. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

随机推荐

  1. 【Tool】Augmentor和imgaug——python图像数据增强库

    Augmentor和imgaug--python图像数据增强库 Tags: ComputerVision Python 介绍两个图像增强库:Augmentor和imgaug,Augmentor使用比较 ...

  2. Java基础学习总结(65)——Java中的String,StringBuilder和StringBuffer比较

    字符串,就是一系列字符的集合. Java里面提供了String,StringBuffer和StringBuilder三个类来封装字符串,其中StringBuilder类是到jdk 1.5才新增的.字符 ...

  3. [Beginning SharePoint Designer 2010]Chapter5 主题和样式

    本章概要: 1.什么是CSS 2.样式表的组成 3.如何管理CSS适应SPD的工具和特性 4.被SPS使用的关键的CSS类别 5.使用SPD应用样式到你的站点上

  4. 分享几个可用的rtsp, http測试url

    rtsp://218.204.223.237:554/live/1/0547424F573B085C/gsfp90ef4k0a6iap.sdp rtsp://218.204.223.237:554/l ...

  5. 宝马男砍人不慎刀落反被杀 防卫过当or故意伤害(在生命受到威胁的情况下,已经很难判断对方意图了,而且假如于莫是老弱妇幼,可能现在死的就是于莫了)

    如果被砍的是周律师他就不会说是防为过当吧,宝马车主跑回自己的车边时最危险,不知道他车上还有什么刀枪之类的.这如果判防卫过当,恶人会更恶,老实人连防卫都不敢了. 不知道在这个没有法治的国家会是如何判案的 ...

  6. Linux下配置httpd服务

    第一步拷贝 cp /usr/local/apache2/bin/apachectl /etc/rc.d/init.d/httpd 第二步,修改 vim /etc/rc.d/init.d/httpd # ...

  7. 英语发音规则---Q字母

    英语发音规则---Q字母 一.总结 一句话总结: 1.Q/que发[k]音? Iraq [ɪ'rɑ:k] n. 伊拉克 cheque [tʃek] n. 支票 2.Qu-发[kw]? quality ...

  8. 初涉springboot

    1.首先,我们需要了解微服务是什么? 微服务 (Microservices) 是一种软件架构风格,它是以专注于单一责任与功能的小型功能区块 (Small Building Blocks) 为基础,利用 ...

  9. Extjs 可重用组件开始写 2014 8 23日

    今天开始自己去写组件. 这次写组件重点在于参考cfWeb来写出自己的组件. 首先先把结构做出来. 对于这次的自定义组件,现在所做的事情关键在于上面四个文件.于是将上面四个文件贴出来. MyApp.js ...

  10. IBM 总架构师:话说程序员的职业生涯

    作者:IBM 软件集团大中华区总架构师 寇卫东 有一些年轻的程序员向我咨询,将来的路应该怎么走?俗话说,条条大路通罗马.不同的路都能走向成功.到底选哪条路,取决于自己的兴趣.可能有程序员会问:如果还没 ...