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)) ...
随机推荐
- 【转载】maven入门1
学习maven的使用,看到一篇很实用的入门教程(菜鸟级入门) 2007-08-28 14:01:04 标签:maven 职场 休闲 一.前言 早就知道maven 在java 项目的管理 ...
- Windows 7 英文版操作系统中文软件乱码解决方法
http://blog.csdn.net/lqhbupt/article/details/18863243
- Triangles 正多边形分割锐角三角形
题目描述 已知一个圆的圆周被N个点分成了N段等长圆弧,求任意取三个点,组成锐角三角形的个数. 输入 多组数据,每组数据一个N(N <= 1000000) 输出 对于每组数据,输出不同锐角三角形的 ...
- 百视通与微软共同宣布9月在华发布Xbox One
4月30日消息,百视通今日与微软共同宣布,于今年9月在华发布Xbox One.这是继百视通与微软2013年9月成立合资公司后,双方合作的又一进展. 微软副总裁,硬件及设计工作室部门主管尤瑟夫 •梅赫迪 ...
- Pandas 命令整理
在网上看到一个整理的很好的pandas命令合集,转一份供自己查找与参考
- AppStore 中的app怎么样生成二维码,来提供下载
首先在:iTunes里面找到 AppStore模块,然后搜索你的 App 在App 下载选项有 Copy Link ,拷贝地址 在二维码生成器里直接生成二维码就,OK 如果,想要多个和安卓做一个二维 ...
- [LeetCode&Python] Problem 575. Distribute Candies
Given an integer array with even length, where different numbers in this array represent different k ...
- 前端jquery学习--03
1.tab切换 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- CTF之栅栏密码
栅栏密码是比较常见的加密方式之一,其原理是将一组明文分成N组,将每一组的第一个明文取出按照顺序组成一串密文,并将这段密文附在第一段密文之后,以此类推 例如: 分了两组,即秘钥为2: 明文:THERE ...
- sdut2165 Crack Mathmen (山东省第二届ACM省赛)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/svitter/article/details/24270265 本文出自:http://blog.c ...