Description

给定一个n×n的棋盘,棋盘上每个位置要么为空要么为障碍。定义棋盘上两个位置(x,y),(u,v)能互相攻击当前仅
当满足以下两个条件:
1:x=u或y=v
2:对于(x,y)与(u,v)之间的所有位置,均不是障碍。
现在有q个询问,每个询问给定ki,要求从棋盘中选出ki个空位置来放棋子,问最少互相能攻击到的棋子对数是多少?

Input

第一行一个整数n。
接下来输入一个n×n的字符矩阵,一个位置若为.,则表示这是一个空位置,若为#,则为障碍。
第n+2行输入一个整数q代表询问个数。
接下来q行,每行一个整数k,代表要放的棋子个数。
n ≤ 50, q ≤ 10000, k ≤ 棋盘中空位置数量

Output

输出共q行,每行代表对应询问的最少的互相能攻击到的棋子对数。
不难得出费用流的模型,由于图的特殊性可用bfs求最小费用增广路
#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: 棋盘的更多相关文章

  1. BZOJ 1057 棋盘制作

    Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴 ...

  2. BZOJ 1057 棋盘制作(最大01相间子矩阵)

    求最大01相间子矩阵可以转换为求最大全0子矩阵.只需把棋盘(x+y)为奇数的取反,而该问题可以用经典的悬线法O(n^2)的求解. 悬线法呢. 首先定义b[i][j],为a[i][j]向上的最大连续0的 ...

  3. 【以前的空间】bzoj [ZJOI2007]棋盘制作

    具体可以去跪<浅谈用极大化思想解决最大子矩形问题>(p.s. 蒟蒻跪了还是很晕,不过想到之前usaco好像是最后一章的一道题……看了下代码顿然醒悟) 也就是如果用o(nm)的方法维护一个极 ...

  4. 2877: [Noi2012]魔幻棋盘 - BZOJ

    DescriptionInput 第一行为两个正整数N,M,表示棋盘的大小. 第二行为两个正整数X,Y,表示棋盘守护者的位置. 第三行仅有一个正整数T,表示棋盘守护者将进行次操作. 接下来N行,每行有 ...

  5. 1057: [ZJOI2007]棋盘制作 - BZOJ

    Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴 ...

  6. bzoj 2706: [SDOI2012]棋盘覆盖 Dancing Link

    2706: [SDOI2012]棋盘覆盖 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 255  Solved: 77[Submit][Status] ...

  7. BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )

    状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...

  8. bzoj 1057: [ZJOI2007]棋盘制作 单调栈

    题目链接 1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 2027  Solved: 1019[Submit] ...

  9. 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)) ...

随机推荐

  1. 【转载】maven入门1

    学习maven的使用,看到一篇很实用的入门教程(菜鸟级入门) 2007-08-28 14:01:04 标签:maven 职场 休闲 一.前言         早就知道maven 在java 项目的管理 ...

  2. Windows 7 英文版操作系统中文软件乱码解决方法

    http://blog.csdn.net/lqhbupt/article/details/18863243

  3. Triangles 正多边形分割锐角三角形

    题目描述 已知一个圆的圆周被N个点分成了N段等长圆弧,求任意取三个点,组成锐角三角形的个数. 输入 多组数据,每组数据一个N(N <= 1000000) 输出 对于每组数据,输出不同锐角三角形的 ...

  4. 百视通与微软共同宣布9月在华发布Xbox One

    4月30日消息,百视通今日与微软共同宣布,于今年9月在华发布Xbox One.这是继百视通与微软2013年9月成立合资公司后,双方合作的又一进展. 微软副总裁,硬件及设计工作室部门主管尤瑟夫 •梅赫迪 ...

  5. Pandas 命令整理

    在网上看到一个整理的很好的pandas命令合集,转一份供自己查找与参考

  6. AppStore 中的app怎么样生成二维码,来提供下载

    首先在:iTunes里面找到  AppStore模块,然后搜索你的 App 在App 下载选项有 Copy Link ,拷贝地址 在二维码生成器里直接生成二维码就,OK 如果,想要多个和安卓做一个二维 ...

  7. [LeetCode&Python] Problem 575. Distribute Candies

    Given an integer array with even length, where different numbers in this array represent different k ...

  8. 前端jquery学习--03

    1.tab切换 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  9. CTF之栅栏密码

    栅栏密码是比较常见的加密方式之一,其原理是将一组明文分成N组,将每一组的第一个明文取出按照顺序组成一串密文,并将这段密文附在第一段密文之后,以此类推 例如: 分了两组,即秘钥为2: 明文:THERE ...

  10. sdut2165 Crack Mathmen (山东省第二届ACM省赛)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/svitter/article/details/24270265 本文出自:http://blog.c ...