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;
}

转载于:https://www.cnblogs.com/mrasd/p/9526200.html

bzoj 1814 Fornula 1相关推荐

  1. BZOJ 1814 Ural 1519 Formula 1

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1814 题解 插头dp,枚举边界线的插头,分类讨论转移点上插头和左插头的情况,来转移这个点 ...

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

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

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

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

  4. CSS设置表格行列,给bootstrap table设置行列单元格样式

    1.根据单元格或者行内其他单元格的内容,给该单元格设置一定的css样式 columns: [{ field: 'index', title: '序号', align:"center" ...

  5. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  6. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  7. BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)

    题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...

  8. BZOJ 2957楼房重建

    传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...

  9. BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)

    BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...

  10. bzoj 4871: [Shoi2017]摧毁“树状图”

    4871: [Shoi2017]摧毁"树状图" Time Limit: 25 Sec  Memory Limit: 512 MB Submit: 53  Solved: 9 [Su ...

最新文章

  1. c++类中成员的构造顺序
  2. 读《不要等到毕业以后》有感①
  3. python学习笔记 day25 封装
  4. Android Support v4、v7、v13 介绍
  5. 用于显示本地通知的跨平台插件flutter_local_notifications
  6. 粘包问题,以及在python中如何调用操作系统命令
  7. HDU计算机网络系统2021复习提纲
  8. linux删除具有指定内容的文件,Linux bash删除文件中含“指定内容”的行功能示例...
  9. Oracle提升查询性能之-简单范围分区表的创建
  10. Shell脚本学习-阶段三
  11. DSP之直接存储器访问控制器
  12. Python内置函数(55)——globals
  13. 将oracle的数据导入到mysql的三种方法
  14. 简明python教程电子书下载_简明Python教程PDF电子书免费下载
  15. cs1.6服务器修改游戏类型,cs1.6联机及游戏模式详细解读
  16. WIN10创建虚拟桌面
  17. uni-app海报(合成图片)demo
  18. linux 操作系统:setenv
  19. 【SCIR笔记】文档级事件抽取简述
  20. 续编-联想原装系统OEM系统联想出厂系统联想原装系统Lenovo ThinkPad ThinkBook出厂预装系统原厂系统

热门文章

  1. 火狐浏览器百度网盘服务器响应,火狐浏览器打不开百度网盘怎么解决?解决不开百度网盘的方法说明...
  2. USB之:MTKUSB软件框架及其MassStorage Class规范学习
  3. android悬浮功能实现,Android利用悬浮按钮实现翻页效果
  4. 大数据四大阵营之OLTP阵营(上)
  5. 学习Vue3 第二十七章(自定义指令directive)
  6. 谈谈值得注意的高危端口
  7. 2021-08-20红外额温枪方案核心芯片ZHW3548
  8. rasterization(栅格化)
  9. HCIA网络基础9-VRP文件系统管理
  10. Java中统计耗时的方法