BZOJ3723 : PA2014Final Gra w podwajanie
暴力搜索出所有可行的形状,可以发现本质不同的形状数只有6000个左右。
对于每个形状,它的大小不超过$8\times 8$,故可以按照右下角为原点重建坐标系,用一个unsigned long long来存储。
然后对于每个中心,先进行第一步扩展,若能成功扩展,则扫描所有形状,看看是否匹配即可。
时间复杂度$O(6000nm)$。
#include<cstdio>
#include<algorithm>
using namespace std;
typedef unsigned long long ll;
const int N=210,M=30000;
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};ll state[8][8];
int n,m,i,j,k,ans[6]={0,1,2,4,8,16};char a[N][N],f[N][N];
struct Shape{
int st[N],en[N],ed,v[N][2],cnt[5][5];ll q[5][5][M];
inline void add(int x,int y){st[++ed]=x;en[ed]=y;}
void dfs(int x){
if(x>ed){
int a=0,b=0;
for(int i=1;i<=x;i++)a=max(a,v[i][0]),b=max(b,v[i][1]);
ll t=0;
for(int i=1;i<=x;i++)t|=state[a-v[i][0]][b-v[i][1]];
q[a][b][++cnt[a][b]]=t;
return;
}
for(int i=0;i<4;i++){
int X=v[st[x]][0]+dx[i],Y=v[st[x]][1]+dy[i],flag=1;
for(int j=1;j<=x;j++)if(v[j][0]==X&&v[j][1]==Y){flag=0;break;}
if(flag)v[en[x]][0]=X,v[en[x]][1]=Y,dfs(x+1);
}
}
void init(int k){
if(k==2){
add(1,2);
}
if(k==3){
add(1,2);
add(1,3);
add(2,4);
}
if(k==4){
add(1,2);
add(1,3);
add(1,4);
add(2,5);
add(2,6);
add(3,7);
add(5,8);
}
if(k==5){
add(1,2);
add(1,3);
add(1,4);
add(1,5);
add(2,6);
add(2,7);
add(2,8);
add(3,9);
add(3,10);
add(4,11);
add(6,12);
add(6,13);
add(7,14);
add(9,15);
add(12,16);
}
dfs(1);
for(int i=0;i<5;i++)for(int j=0;j<5;j++)if(cnt[i][j]){
sort(q[i][j]+1,q[i][j]+cnt[i][j]+1);
int k=0;
for(int x=1;x<=cnt[i][j];x++)if(q[i][j][x]!=q[i][j][x-1])q[i][j][++k]=q[i][j][x];
cnt[i][j]=k;
}
}
}G[6];
inline bool check(int x,int y,int z){
if(f[x][y]<z-1)return 0;
if(f[x][y]>=z)return 1;
if(z<5)return 1;
if(check(x-1,y,1)&&check(x+1,y,2)&&check(x,y-1,3)&&check(x,y+1,4))return 1;
if(check(x-1,y,1)&&check(x+1,y,2)&&check(x,y-1,4)&&check(x,y+1,3))return 1;
if(check(x-1,y,1)&&check(x+1,y,3)&&check(x,y-1,2)&&check(x,y+1,4))return 1;
if(check(x-1,y,1)&&check(x+1,y,3)&&check(x,y-1,4)&&check(x,y+1,2))return 1;
if(check(x-1,y,1)&&check(x+1,y,4)&&check(x,y-1,2)&&check(x,y+1,3))return 1;
if(check(x-1,y,1)&&check(x+1,y,4)&&check(x,y-1,3)&&check(x,y+1,2))return 1;
if(check(x-1,y,2)&&check(x+1,y,1)&&check(x,y-1,3)&&check(x,y+1,4))return 1;
if(check(x-1,y,2)&&check(x+1,y,1)&&check(x,y-1,4)&&check(x,y+1,3))return 1;
if(check(x-1,y,2)&&check(x+1,y,3)&&check(x,y-1,1)&&check(x,y+1,4))return 1;
if(check(x-1,y,2)&&check(x+1,y,3)&&check(x,y-1,4)&&check(x,y+1,1))return 1;
if(check(x-1,y,2)&&check(x+1,y,4)&&check(x,y-1,1)&&check(x,y+1,3))return 1;
if(check(x-1,y,2)&&check(x+1,y,4)&&check(x,y-1,3)&&check(x,y+1,1))return 1;
if(check(x-1,y,3)&&check(x+1,y,1)&&check(x,y-1,2)&&check(x,y+1,4))return 1;
if(check(x-1,y,3)&&check(x+1,y,1)&&check(x,y-1,4)&&check(x,y+1,2))return 1;
if(check(x-1,y,3)&&check(x+1,y,2)&&check(x,y-1,1)&&check(x,y+1,4))return 1;
if(check(x-1,y,3)&&check(x+1,y,2)&&check(x,y-1,4)&&check(x,y+1,1))return 1;
if(check(x-1,y,3)&&check(x+1,y,4)&&check(x,y-1,1)&&check(x,y+1,2))return 1;
if(check(x-1,y,3)&&check(x+1,y,4)&&check(x,y-1,2)&&check(x,y+1,1))return 1;
if(check(x-1,y,4)&&check(x+1,y,1)&&check(x,y-1,2)&&check(x,y+1,3))return 1;
if(check(x-1,y,4)&&check(x+1,y,1)&&check(x,y-1,3)&&check(x,y+1,2))return 1;
if(check(x-1,y,4)&&check(x+1,y,2)&&check(x,y-1,1)&&check(x,y+1,3))return 1;
if(check(x-1,y,4)&&check(x+1,y,2)&&check(x,y-1,3)&&check(x,y+1,1))return 1;
if(check(x-1,y,4)&&check(x+1,y,3)&&check(x,y-1,1)&&check(x,y+1,2))return 1;
if(check(x-1,y,4)&&check(x+1,y,3)&&check(x,y-1,2)&&check(x,y+1,1))return 1;
return 0;
}
inline bool ok(int x,int y){
if(x<1||x>n||y<1||y>m)return 0;
return a[x][y];
}
inline bool judge(int x,int y,int z){
int i,j,k,l;
for(i=0;i<5;i++)for(j=0;j<5;j++){
ll t=0;
for(k=0;k<8;k++)for(l=0;l<8;l++)if(ok(x+i-k,y+j-l))t|=state[k][l];
for(k=G[z].cnt[i][j];k;k--)if((G[z].q[i][j][k]&t)==G[z].q[i][j][k])return 1;
}
return 0;
}
int main(){
for(i=0;i<8;i++)for(j=0;j<8;j++)state[i][j]=1ULL<<(i*8+j);
for(i=2;i<=5;i++)G[i].init(i);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)for(scanf("%s",a[i]+1),j=1;j<=m;j++)a[i][j]-='0';
for(i=1;i<=n;i++)for(j=1;j<=m;j++)f[i][j]=a[i][j];
for(k=2;k<=5;k++)for(i=1;i<=n;i++)for(j=1;j<=m;j++)if(check(i,j,k))if(judge(i,j,k))f[i][j]++;
for(i=1;i<=n;i++)for(j=1;j<=m;j++)printf("%d%c",ans[f[i][j]],j<m?' ':'\n');
return 0;
}
BZOJ3723 : PA2014Final Gra w podwajanie的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 【题解】IOI2005River 河流
一节语文课想出来的玩意儿,调了几个小时……可见细心&好的代码习惯是有多么的重要 (:へ:) 不过,大概竞赛最令人开心的就是能够一点一点的感受到自己的进步吧,一天比一天能够自己想出更多的题,A题 ...
- 数据结构实验之图论五:从起始点到目标点的最短步数(BFS)
分析:有向图里面找最短路径,原理就是每一步都走距离自己最近的路, 一旦发现走一步可以到,那么这个一定是最短的. #include <bits/stdc++.h> using namespa ...
- luogu 2515
对于软件的依赖可以转化为图上点之间的边的关系发现对于一个强联通分量内的软件,一安则全安Tarjan缩点缩点后,从虚拟节点 0 向所有入度为 0 的点连边这样就构成了一棵树树形 dp$dp[i][j]$ ...
- lucene入门创建索引——(二)
1.程序宏观结构图
- Góra urządzenia z dwoma zwiększyć moc może sprawić
Zaprojektowany z rzeczywistym komfortu i łatwości od sportowca w swoim umyśle, kolejna edycja ze wzr ...
- bzoj 3728: PA2014Final Zarowki
3728: PA2014Final Zarowki Description 有n个房间和n盏灯,你需要在每个房间里放入一盏灯.每盏灯都有一定功率,每间房间都需要不少于一定功率的灯泡才可以完全照亮.你可 ...
- 【BZOJ3728】PA2014Final Zarowki 贪心
[BZOJ3728]PA2014Final Zarowki Description 有n个房间和n盏灯,你需要在每个房间里放入一盏灯.每盏灯都有一定功率,每间房间都需要不少于一定功率的灯泡才可以完全照 ...
- curl -w,–write-out参数详解
顾名思义,write-out的作用就是输出点什么.curl的-w参数用于在一次完整且成功的操作后输出指定格式的内容到标准输出. 输出格式由普通字符串和任意数量的变量组成,输出变量需要按照%{varia ...
随机推荐
- 三、jQuery--jQuery基础--jQuery基础课程--第2章 jQuery 基础选择器
1.#id选择器 jquery能使用CSS选择器来操作网页中的标签元素.如果你想要通过一个id号去查找一个元素,就可以使用如下格式的选择器:$("#my_id") 其中#my_id ...
- sql server 的cpu使用率过高的分析
有哪些SQL语句会导致CPU过高? 1.编译和重编译 编译是 Sql Server 为指令生成执行计划的过程.Sql Server 要分析指令要做的事情,分析它所要访问的表格结构,也就是生成执行计划的 ...
- mysql的存储过程
mysql5中开始引入存储过程,存储过程是一组为了完成特定功能的sql语句集,经编译后存储在数据库中. 存储过程的特点(优点): 1:减小网络通信量.调用一个行数不多的存储过程与直接高用SQL语名的网 ...
- c# 扩展方法奇思妙用基础篇八:Distinct 扩展(转载)
转载地址:http://www.cnblogs.com/ldp615/archive/2011/08/01/distinct-entension.html 刚看了篇文章 <Linq的Distin ...
- .Learning.Python.Design.Patterns.2nd.Edition之单实例模式
可以慢慢理解.. 对照JAVA class Singleton(object): def __new__(cls): if not hasattr(cls, 'instance'): cls.inst ...
- [LeetCode] Same Tree
Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...
- HDU1294 Rooted Trees Problem(整数划分 组合数学 DP)
讲解见http://www.cnblogs.com/IMGavin/p/5621370.html, 4 可重组合 dfs枚举子树的节点个数,相乘再累加 1 #include<iostream& ...
- JqueryEasyUI 解决IE下datagrid无法刷新的问题 分类: JavaScript JqueryEasyUI 2014-09-20 10:05 510人阅读 评论(1) 收藏
问题描述: 在使用JqueryEasyUI 时,发现在IE下$('#table').datagrid('reload');无效,数据并没有被刷新,究其原因,是因为刷新时,datagrid请求的url没 ...
- 比较两个文件文件可以使用MD5比较工具
举例来说,当我们对一个设备进行升级. 固件程序是一个文件,而我们发送的数据可以组成一个文档, 实质是把这两个文件拖入到下图中的工具中,查看一下MD5值.SHA1值.CRC32的值,如果值都一样说明这两 ...
- loj 1167(二分+最大流)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26881 思路:我们可以二分最大危险度,然后建图,由于每个休息点只能 ...