【bzoj2331】[SCOI2011]地板
题目链接:
题解:
分类讨论好烦啊!
0表示没有插头,1、2表示有插头,1表示接下来可以转弯,2表示接下来不能转弯,只能停在一个地方。
然后分类讨论:
| 插头状态 | 到达状态 |
| 0 0 | 2 2 | 1 0 | 0 1 |
|
0 1 0 2 |
0 2 | 1 0 0 0 | 0 2 |
|
1 0 2 0 |
与上列相反 |
|
1 1 |
0 0 |
对于[0 2]的讨论容易想错,开始我想可以在下面会变成[1 0],然而发现WA了,仔细思考发现我想的在下面转弯完全可以在这里断掉,然后再开一个新的,我只要在意当前这个L型砖的走向即可。
代码:
#define Troy #include <bits/stdc++.h> using namespace std; const int mod=,
N=2e5+; int n,m,c,xx,yy,dp[][N],tot[],stk[][N],h[N],bit[],ans; char mp[][]; inline void reversal(){
char s[][];
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
s[j][i]=mp[i][j];
memcpy(mp,s,sizeof(mp));
swap(n,m);
} inline void _plus(int &x,int y){
x+=y;
if(x>=mod) x-=mod;
} struct edges{
int v;edges *last;
}edge[N],*head[(int)4e4];int cnt; inline void push(int s,int val){
int pos=s%;
for(edges *i=head[pos];i;i=i->last){
if(stk[c][i->v]==s){
(dp[c][i->v]+=val)%=mod;
return ;
}
}
// while(h[pos]!=-1){
// if(stk[t][h[pos]]==s){
// dp[t][h[pos]]+=val;
// return ;
// }
// ++pos;
// if(pos==N) pos=0;
// }
dp[c][++tot[c]]=val; stk[c][tot[c]]=s;
edge[++cnt]=(edges){tot[c],head[pos]};head[pos]=edge+cnt;
} inline void DP(){
dp[][]=,tot[]=;
register int i,j,k;
for(i=;i<=n;++i){
for(j=;j<=tot[c];++j) stk[c][j]<<=;
for(j=;j<=m;++j){
c^=;tot[c]=;cnt=;
memset(head,,sizeof(head));
for(k=;k<=tot[c^];++k){
int s=stk[c^][k],p=(s>>bit[j-])&,q=(s>>bit[j])&;
int val=dp[c^][k];
if(!mp[i][j]){
if(!p&&!q) push(s,val);
}else if(!p&&!q){
int x;
if(mp[i+][j]){
x=s+(<<bit[j-]);
push(x,val);
}if(mp[i][j+]){
x=s+(<<bit[j]);
push(x,val);
}if(mp[i+][j]&&mp[i][j+]){
s+=(<<bit[j-])+(<<bit[j])<<;
push(s,val);
}
}else if(!p){
if(q==){
if(mp[i+][j]){
push(s^(<<bit[j-]^(<<bit[j])),val);
}
if(mp[i][j+]){
push(s+(<<bit[j]),val);
}
}else{
s^=q<<bit[j];
push(s,val);
if(mp[i+][j])
push(s^(<<bit[j-]+),val);
}
}else if(!q){
if(p==){
if(mp[i][j+]){
push(s^(<<bit[j-]^(<<bit[j])),val);
}
if(mp[i+][j]){
push(s+(<<bit[j-]),val);
}
}else{
s^=(<<bit[j-]+);
push(s,val);
if(mp[i][j+])
push(s^(<<bit[j]+),val);
}
}else if(p+q==){
s^=(<<bit[j-])+(<<bit[j]);
push(s,val);
}
}
}
}
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i) scanf("%s",mp[i]+);
for(int i=;i<=;++i) bit[i]=i<<;
if(n<m) reversal();
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
if(mp[i][j]=='_') mp[i][j]=,xx=i,yy=j;
else mp[i][j]=;
DP();
printf("%d\n",tot[c]?dp[c][]:);
}
【bzoj2331】[SCOI2011]地板的更多相关文章
- bzoj2331 [SCOI2011]地板
Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里有些位置有柱子,不能铺地板.现在小L想知道,用 ...
- 【BZOJ2331】[SCOI2011]地板 插头DP
[BZOJ2331][SCOI2011]地板 Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里 ...
- bzoj 2331: [SCOI2011]地板 插头DP
2331: [SCOI2011]地板 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 541 Solved: 239[Submit][Status] D ...
- BZOJ2331:[SCOI2011]地板——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2331 题面复制于洛谷 题目描述 lxhgww的小名叫”小L“,这是因为他总是很喜欢L型的东西.小L家 ...
- bzoj:2331: [SCOI2011]地板
Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里有些位置有柱子,不能铺地板.现在小L想知道,用 ...
- 2331: [SCOI2011]地板 插头DP
国际惯例的题面:十分显然的插头DP.由于R*C<=100,所以min(R,C)<=10,然后就可以愉悦地状压啦.我们用三进制状压,0表示没有插头,1表示有一个必须延伸至少一格且拐弯的插头, ...
- 【BZOJ】2331: [SCOI2011]地板
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2331 一眼插头DP... 考虑一个L形的东西,要构成它可以划分为两个阶段,即当前线段是拐了 ...
- 【BZOJ】2331: [SCOI2011]地板 插头DP
[题意]给定n*m的地板,有一些障碍格,要求用L型的方块不重不漏填满的方案数.L型方块是从一个方格向任意两个相邻方向延伸的方块,不能不延伸.n*m<=100. [算法]插头DP [题解]状态0表 ...
- P3272 [SCOI2011]地板
\(\color{#0066ff}{ 题目描述 }\) lxhgww的小名叫"小L",这是因为他总是很喜欢L型的东西.小L家的客厅是一个R*C的矩形,现在他想用L型的地板来铺满整个 ...
随机推荐
- android DialogFragment 实现Dialog展示扫二维码图片展示
近期开发项目,做个按钮点击弹出展示微信二维码关注微信公众号的展示框,于是想到DialogFragment,期间对Dialog的title的底框字体颜色做出相关设置,记录如下: 下面是 DialogFr ...
- 没人看系列-----html随笔
<!DOCTYPE> 目录 没人看系列-----html/css详解 前言 不多说这段时间写了好多好多前端的东西,以至于自己重新返回看了一遍前端的所有技术.故此做个总结,准备学东西的请绕行 ...
- Windows 10创意者更新ISO发布!官方下载
http://news.mydrivers.com/1/526/526719.htm 去年7月份,微软面向Windows 10推出了“周年更新”,让系统变得更加稳定好用.今天,Windows 10迎来 ...
- Android两级嵌套ListView滑动问题的解决
Android下面两级嵌套ListView会出现滑动失效,解决方案,把两级Listview全换成NoScrollListView,代码如下: public class NoScrollListView ...
- 《T-SQL查询》读书笔记Part 1.逻辑查询处理知多少
一.关于T-SQL T-SQL是ANSI和ISO SQL标准的MS SQL扩展,其正式名称为Transact-SQL,但一般程序员都称其为T-SQL. 二.逻辑查询处理各个阶段 2.1 逻辑查询处理流 ...
- [已解决]pycharm的debugger模式不显示调试结果?
由于朋友遇到这个问题,特意上网搜索了很久,没有相关答案,后来自己尝试与能正常显示的做设置对比,才找到控制开关,在此做个记录,分享给遇到这个问题的朋友. 问题如下图: 解决办法: 左上角File--&g ...
- Robot framework(RF) Builti,Screenshot和Collections标准库介绍
1.1 Builti标准类库 在学习一门编程语言的时候,大多教材都是从打印“hello world”开始.我们可以像编程语言一样来学习Robot Framework.虽然通过RIDE 提供“填表”一 ...
- 基于Kafka Connect框架DataPipeline在实时数据集成上做了哪些提升?
在不断满足当前企业客户数据集成需求的同时,DataPipeline也基于Kafka Connect 框架做了很多非常重要的提升. 1. 系统架构层面. DataPipeline引入DataPipeli ...
- 对于 Netty ByteBuf 的零拷贝(Zero Copy) 的理解
此文章已同步发布在我的 segmentfault 专栏. 根据 Wiki 对 Zero-copy 的定义: "Zero-copy" describes computer opera ...
- https://doc.opensuse.org/projects/kiwi/doc/
KIWI 是用于创建操作系统映像的系统.映像是带有一个文件的目录,该文件包含操作系统.其应用程序与配置.操作系统的文件系统结构.可能的附加元数据,以及(取决于映像类型)磁盘几何属性和分区表数据.通过 ...