bzoj千题计划135:bzoj1066: [SCOI2007]蜥蜴
http://www.lydsy.com/JudgeOnline/problem.php?id=1066
每个柱子拆成两个点 i<<1,i<<1|1,之间连流量为高度的边
如果第i根柱子有蜥蜴,S向i<<1连边,流量为1
如果第i根柱子能跳出去,i<<1|1向T连边,流量为inf
如果第i根柱子能跳到第j根柱子,i<<1|1向j<<1连边,流量为inf
至于每根柱子每个时刻只能有一个蜥蜴,不需要管,总可以通过先后顺序调整成满足条件
- #include<queue>
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- #define N 900
- #define M 21500
- const int inf=1e9;
- char s[];
- int mp[][];
- int cnt;
- int id[][];
- int tot=;
- int front[N],nxt[M<<],to[M<<],val[M<<],from[M<<];
- int lev[N],num[N];
- int path[N];
- int cur[N];
- int src,decc;
- void add(int u,int v,int w)
- {
- to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; from[tot]=u; val[tot]=w;
- to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; from[tot]=v; val[tot]=;
- //cout<<u<<' '<<v<<' '<<w<<'\n';
- }
- bool bfs()
- {
- queue<int>q;
- for(int i=src;i<=decc;++i) lev[i]=decc;
- q.push(decc);
- lev[decc]=;
- int now,t;
- while(!q.empty())
- {
- now=q.front();
- q.pop();
- for(int i=front[now];i;i=nxt[i])
- {
- t=to[i];
- if(lev[t]==decc && val[i^])
- {
- lev[t]=lev[now]+;
- q.push(t);
- }
- }
- }
- return lev[src]!=decc;
- }
- int augment()
- {
- int now=decc,flow=inf;
- int i;
- while(now!=src)
- {
- i=path[now];
- flow=min(flow,val[i]);
- now=from[i];
- }
- now=decc;
- while(now!=src)
- {
- i=path[now];
- val[i]-=flow;
- val[i^]+=flow;
- now=from[i];
- }
- return flow;
- }
- int isap()
- {
- int flow=;
- if(!bfs()) return ;
- memset(num,,sizeof(num));
- for(int i=src;i<=decc;++i) num[lev[i]]++,cur[i]=front[i];
- int now=src,t;
- while(lev[src]<decc)
- {
- if(now==decc)
- {
- flow+=augment();
- now=src;
- }
- bool advanced=false;
- for(int i=cur[now];i;i=nxt[i])
- {
- t=to[i];
- if(lev[t]==lev[now]- && val[i])
- {
- advanced=true;
- path[t]=i;
- cur[now]=i;
- now=t;
- break;
- }
- }
- if(!advanced)
- {
- int mi=decc;
- for(int i=front[now];i;i=nxt[i])
- if(val[i]) mi=min(mi,lev[to[i]]);
- if(!--num[lev[now]]) break;
- num[lev[now]=mi+]++;
- cur[now]=front[now];
- if(now!=src) now=from[path[now]];
- }
- }
- return flow;
- }
- int main()
- {
- int n,m,k;
- scanf("%d%d%d",&n,&m,&k);
- for(int i=;i<=n;++i)
- {
- scanf("%s",s+);
- for(int j=;j<=m;++j)
- {
- mp[i][j]=s[j]-'';
- if(mp[i][j]) id[i][j]=++cnt;
- }
- }
- src=; decc=(cnt<<|)+;
- int x,y;
- for(int i=;i<=n;++i)
- for(int j=;j<=m;++j)
- {
- if(!mp[i][j]) continue;
- add(id[i][j]<<,id[i][j]<<|,mp[i][j]);
- for(int r=;r<=n;++r)
- for(int c=;c<=m;++c)
- {
- if(!mp[r][c] || (r==i && c==j)) continue;
- if((r-i)*(r-i)+(c-j)*(c-j)<=k*k) add(id[i][j]<<|,id[r][c]<<,mp[i][j]);
- //if(abs(r-i)+abs(c-j)<=k) add(id[i][j]<<1|1,id[r][c]<<1,inf);
- }
- if(i<=k || j<=k || n-i<k || m-j<k) add(id[i][j]<<|,decc,inf);
- }
- int sum=;
- for(int i=;i<=n;++i)
- {
- scanf("%s",s+);
- for(int j=;j<=m;++j)
- {
- if(s[j]=='L')
- {
- sum++;
- add(src,id[i][j]<<,);
- }
- }
- }
- cout<<sum-isap();
- }
1066: [SCOI2007]蜥蜴
Time Limit: 1 Sec Memory Limit: 162 MB
Submit: 4407 Solved: 2245
[Submit][Status][Discuss]
Description
在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃
到边界外。 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石
柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不
变),如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同一个
石柱上。
Input
输入第一行为三个整数r,c,d,即地图的规模与最大跳跃距离。以下r行为石竹的初始状态,0表示没有石柱
,1~3表示石柱的初始高度。以下r行为蜥蜴位置,“L”表示蜥蜴,“.”表示没有蜥蜴。
Output
输出仅一行,包含一个整数,即无法逃离的蜥蜴总数的最小值。
Sample Input
00000000
02000000
00321100
02000000
00000000
........
........
..LLLL..
........
........
Sample Output
HINT
100%的数据满足:1<=r, c<=20, 1<=d<=4
bzoj千题计划135:bzoj1066: [SCOI2007]蜥蜴的更多相关文章
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
- bzoj千题计划177:bzoj1858: [Scoi2010]序列操作
http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...
- bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...
- bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...
- bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹
http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...
- bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机
http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...
- bzoj千题计划250:bzoj3670: [Noi2014]动物园
http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...
随机推荐
- 第三个spirit(第十四天)
一 .进度(自习室) 本来十号要开始进行第三次冲刺,不过因为团队很多成员要进行协会和组织的换届,而且团队还换了新 人又加了人进来,所以我们今天才是第三次冲刺的第一天.我们进行了新团队的第一次会议.基于 ...
- angularJS1笔记-(7)-控制器的合理使用(显示和隐式的依赖注入)
AngularJS依赖注入 1.隐式注入:不需要开发人员干预,angularJS自动根据参数的名称识别和注入数据 app.controller("myCtrl".function( ...
- beta 发布的相关评论
1. 礼物挑选小工具 飞天小女警 这个项目的创意独具匠心,贴近实际,令人耳目一新,网站的页面也是玫红色的,配色让人感到很温馨,对礼物的筛选方式很有趣,使用的记录特殊日子的方法来提醒自己挑选礼 ...
- MiniUI合并单元格
function onload(e){ var grid = e.sender; var len = grid.data.length; var data= grid.data; ,num=; var ...
- 【转载】Vue项目中的文件/文件夹命名规范
文件或文件夹的命名遵循以下原则: index.js 或者 index.vue,统一使用小写字母开头的(kebab-case)命名规范 属于组件或类的,统一使用大写字母开头的(PascalCase)命名 ...
- [cnbeta] 波音系列飞机价格。。。
https://www.cnbeta.com/articles/tech/786745.htm 单价最便宜的是波音737-700,为0.858亿美元(约合5.96亿元). 评论网友调侃,“你家能满40 ...
- MySql--学习成长过程
MySql--学习成长过程 模拟测试: QQ数据库管理 一.创建数据库并添加关系和测试数据 1 ##创建QQ数据库,完成简单的测试 2 3 #创建数据库 4 DROP DATABASE IF EXIS ...
- 手写简单的promise
function Promise(fn) { var that = this; this.status = "pedding"; this.value = undefined; / ...
- java中的变量各占得字节数
boolen,8位1个字节int,32位,4个字节float,32位 4个字节double,64位8个字节char 16位,2个字节byte 8位1个字节short 16位 2个字节long 64位 ...
- 【比赛】NOIP2017 总结
一.比赛过程 Day1: 拿到题目后,立即把所有题目都看了一遍,发现没有很虚的期望DP和概率DP,感到很庆幸.然后发现今年的题目顺序好像有点不对,T1是数论,T2像是模拟,这难道是把两天的基础题放到一 ...