bzoj 4930: 棋盘
Description
Input
Output
#include<cstdio>
#include<algorithm>
#include<queue>
const int inf=0x3f3f3f3f;
int n,q,id[][][],id1=,id2=,as[],ap=,d[],l[];
char s[][];
int es[],enx[],ev[],e0[],ep=,lt;
void ae(int a,int b){
es[ep]=b;enx[ep]=e0[a];ev[ep]=;e0[a]=ep++;
es[ep]=a;enx[ep]=e0[b];ev[ep]=;e0[b]=ep++;
}
bool cmp(int a,int b){
return d[a]<d[b];
}
int q0[],ed[],tk=;
std::queue<int>q1;
void mins(int&a,int b){if(a>b)a=b;}
void cal(int w){
if(w>id1)mins(lt,l[w]+d[w]);
for(int i=e0[w];i;i=enx[i])if(ev[i]){
int u=es[i];
if(l[u]>l[w])l[u]=l[w],q1.push(u);
}
}
int dfs(int w){
if(ed[w]==tk)return ;
ed[w]=tk;
if(w>id1&&l[w]+d[w]==lt){
++d[w];
return ;
}
for(int i=e0[w];i;i=enx[i])if(ev[i]&&l[es[i]]==l[w]&&dfs(es[i])){
ev[i]=,ev[i^]=;
return ;
}
return ;
}
bool cal(){
lt=inf;
for(int i=;i<=id1;++i)q0[i]=i,l[i]=d[i];
for(int i=id1+;i<=id2;++i)l[i]=inf;
std::sort(q0+,q0+id1+,cmp);
int qp=;
while(){
if(qp<=id1){
int w=q0[qp];
if(l[w]!=d[w]){++qp;continue;}
if(q1.size()&&l[q1.front()]<l[w])cal(q1.front()),q1.pop();
else cal(w),++qp;
}else if(q1.size())cal(q1.front()),q1.pop();
else break;
}
int flow=;
for(int i=;i<=id1;++tk,++i)if(l[i]==d[i]&&dfs(i))++flow,++d[i];
for(int i=;i<=flow;++i)++ap,as[ap]=as[ap-]+lt;
return flow;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;++i)scanf("%s",s[i]+);
for(int i=;i<=n;++i){
for(int j=;j<=n;++j){
if(s[i][j]!='.')continue;
id[i][j][]=s[i-][j]=='.'?id[i-][j][]:++id1;
id[i][j][]=s[i][j-]=='.'?id[i][j-][]:++id2;
}
}
for(int i=;i<=n;++i){
for(int j=;j<=n;++j)if(s[i][j]=='.'){
ae(id[i][j][],id1+id[i][j][]);
}
}
id2+=id1;
while(cal());
for(scanf("%d",&q);q;--q){
int x;
scanf("%d",&x);
printf("%d\n",as[x]);
}
return ;
}
bzoj 4930: 棋盘的更多相关文章
- BZOJ 1057 棋盘制作
Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴 ...
- BZOJ 1057 棋盘制作(最大01相间子矩阵)
求最大01相间子矩阵可以转换为求最大全0子矩阵.只需把棋盘(x+y)为奇数的取反,而该问题可以用经典的悬线法O(n^2)的求解. 悬线法呢. 首先定义b[i][j],为a[i][j]向上的最大连续0的 ...
- 【以前的空间】bzoj [ZJOI2007]棋盘制作
具体可以去跪<浅谈用极大化思想解决最大子矩形问题>(p.s. 蒟蒻跪了还是很晕,不过想到之前usaco好像是最后一章的一道题……看了下代码顿然醒悟) 也就是如果用o(nm)的方法维护一个极 ...
- 2877: [Noi2012]魔幻棋盘 - BZOJ
DescriptionInput 第一行为两个正整数N,M,表示棋盘的大小. 第二行为两个正整数X,Y,表示棋盘守护者的位置. 第三行仅有一个正整数T,表示棋盘守护者将进行次操作. 接下来N行,每行有 ...
- 1057: [ZJOI2007]棋盘制作 - BZOJ
Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴 ...
- bzoj 2706: [SDOI2012]棋盘覆盖 Dancing Link
2706: [SDOI2012]棋盘覆盖 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 255 Solved: 77[Submit][Status] ...
- BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )
状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...
- bzoj 1057: [ZJOI2007]棋盘制作 单调栈
题目链接 1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 2027 Solved: 1019[Submit] ...
- BZOJ 1057: [ZJOI2007]棋盘制作( dp + 悬线法 )
对于第一问, 简单的dp. f(i, j)表示以(i, j)为左上角的最大正方形, f(i, j) = min( f(i + 1, j), f(i, j + 1), f(i + 1, j + 1)) ...
随机推荐
- [转载]struts1小项目
http://www.blogjava.net/nokiaguy/archive/2009/01/13/251101.html
- Nexcel的行列,和单元格坐标
book.Sheets[1].UsedRange.Rows.Count 行数从1开始 book.Sheets[1].UsedRange.LastCol 从0开始 book.Sheets[1].Cell ...
- L1-018 大笨钟
微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉.不过由于笨钟自己作息也不是很规律,所以敲钟并不定时.一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那 ...
- hibernate多对一和一对多关联
关联,是类的实例之间的关系,表示有意义和值得关注的连接. 多对一单向关联: 单向多对一:<many-to-one>定义一个持久化类与另一个持久化类的关联这种关联是数据表间的多对一关联,需要 ...
- SharePoint的安装和配置-PowerShell
1. 引入SPModule组件 Import-Module SPModule.misc Import-Module SPModule.setup 需要将执行策略修改为不限制 2. 无人值守安装Shar ...
- Loom
<iframe width="630" height="394" src="https://www.useloom.com/embed/a9d4 ...
- Python装饰器的通俗理解
转载:http://blog.csdn.net/u013471155 在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略 ...
- Java第八次作业--数据库编程
Deadline: 2017-5-18 23:00 一.学习要点 认真看书并查阅相关资料,掌握以下内容: 掌握应用JDBC访问数据库的基本步骤 掌握DriverManager类.Connection接 ...
- 转:Linux实时将所有输出重定向到文件
转自: Linux的重定向机制十分好用,我们经常需要在服务器上挂起一个服务程序,然后将该程序的所有输出重定向到某个文件,这样即使我们注销了用户,程序依然在linux服务器上运行着. 但是重定向的输出经 ...
- HDU - 2475:Box(splay维护森林)
There are N boxes on the ground, which are labeled by numbers from 1 to N. The boxes are magical, th ...