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的子节点 那么 ...
随机推荐
- 【Coursera】支持向量机
一.最大间隔分类器 1. 函数间隔:\(γ^{i} = y^{i}(w^{T} x + b)\), 改变w和b的量级,对分类结果不会产生任何影响,但是会改变函数间隔的大小.因此,直接对函数间隔求最大值 ...
- springboot maven
更多信息请从官网获取https://docs.spring.io/spring-boot/docs/2.0.1.RELEASE 1.parent基于自己项目而非spring-boot-starter- ...
- 汇编语言段和RSEG用法
RSEG是段选择指令,要想明白它的意思就要了解段的意思.段是程序代码或数据对象的存储单位.程序代码放到代码段,数据对象放到数据段.段分两种,一是绝对段,一是再定位段.绝对段在汇编语言中指定,在用L51 ...
- Linux操作系统(二)
SSD工作原理:http://www.360doc.com/content/15/0318/15/16824943_456186965.shtml HHD工作原理:http://blog.csdn.n ...
- 6/4 sprint2 看板和燃尽图的更新
- oracle greatest(),least( ) ,coalesce()
--场景1: select pt, greatest(wm), least(wm) from (select s.producttype pt, wm_concat(s.productid) wm f ...
- mysql 数据到 导入导出 总结
数据库数据的导入和导出受secure_file_priv配置项影响#限制导入导出,null时无法进行数据的导入导出,空时不限制,设置了目录则只能对该目录下的文件进行导入导出show variables ...
- springMVC 访问静态资源
问题描述 使用SpringMVC时遇到静态资源无法加载的问题,报404 问题原因 如果SpringMVC的映射模式采用的是后缀名匹配,如[*.do]或者[*.action]则不会出现该问题,因为静态资 ...
- BZOJ3107 CQOI2013二进制A+B(动态规划)
显然答案只与a.b.c中各自1的个数及位数有关.a.b只考虑前i位怎么填时,c最多在第i+1位上为1,而第i+1位及之后的a.b怎么填都不会对前i位造成影响.于是设f[n][i][j][k][0/1] ...
- BZOJ3252 攻略(贪心+dfs序+线段树)
考虑贪心,每次选价值最大的链.选完之后对于链上点dfs序暴力修改子树.因为每个点最多被选一次,复杂度非常正确. #include<iostream> #include<cstdio& ...