【极值问题】【CF1063B】 Labyrinth
Description
给你一个\(n~\times~m\)的矩阵,一开始你在第\(r\)行第\(c\)列。你的上下移动不受限制,向左最多移动\(x\)次,向右最多移动\(y\)次。求你最多能到多少个点。包括起始点。
Input
第一行是\(n\)和\(m\),代表矩阵规模。
第二行是\(r\)和\(c\),代表你的位置
第三行是\(x\)和\(y\),代表移动限制
下面\(n\)行每行\(m\)个字符,有且仅有'.'和''两种。如果第\(i\)行第\(j\)列是''代表你不能经过这个点。
Output
输出一行一个数代表能到的最多点数
Sample Input
4 5
3 2
1 2
.....
.***.
...**
*....
Sample Output
10
Hint
\(For~All:\)
\(0~\leq~n,m,r,c~\leq~2000\),\(0~\leq~x,y~\leq~10^9\)
Solution
朴素的\(bfs\)显然是对的,可以状态太多存不下。
考虑如果从\((sx,sy)\)点到一个点\((x,y)\)时,假设共向右走了\(r\)步,向左走了\(l\)步,显然\(r-l\)是一个定值。具体的,\(r-l~=~y-sy\)。于是,对于任意一个目标\((x,y)\),发现\(l\)事实上与\(r\)线性正相关。对于一个点,显然到该点的\(r\)越小越好,同时由于\(l\)和\(r\)线性正相关,所以最小化\(r\)的同时,\(l\)已经被最小化了。于是可以直接建图跑最短路,所有向右的边权为1,其他边权为0。跑完后扫描整个地图就可以判断合法性了。
这里的一个新姿势是\(0/1bfs\)。当边权只有\(0/1\)时,可以使用双端队列进行bfs,具体的,当当前边的权值时\(0\)时,将终点压入队首,否则压入队尾。考虑这么做的正确性:易证任意一时刻队列中的点dist差值不超过1。于是正确性显然。\(0/1bfs\)的复杂度为\(O(V+E)\)。相比dij少了一个log。
Code
#include<queue>
#include<cstdio>
#include<cstring>
#define rg register
#define ci const int
#define cl const long long int
typedef long long int ll;
namespace IO{
char buf[110];
}
template <typename T>
inline void qr(T &x) {
rg char ch=getchar(),lst=' ';
while((ch > '9') || (ch < '0')) lst=ch,ch=getchar();
while((ch >= '0') && (ch <= '9')) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
if(lst == '-') x=-x;
}
template <typename T>
inline void qw(T x,const char aft,const bool pt) {
if(x < 0) {putchar('-');x=-x;}
rg int top=0;
do {
IO::buf[++top]=x%10+'0';
} while(x/=10);
while(top) putchar(IO::buf[top--]);
if(pt) putchar(aft);
}
template <typename T>
inline T mmax(const T a,const T b) {return a > b ? a : b;}
template <typename T>
inline T mmin(const T a,const T b) {return a < b ? a : b;}
template <typename T>
inline T mabs(const T a) {return a < 0 ? -a : a;}
template <typename T>
inline void mswap(T &a,T &b) {
T _temp=a;a=b;b=_temp;
}
const int maxn = 2010;
const int fx[]={0,-1,0,1};
const int fy[]={1,0,-1,0};
const int fv[]={1,0,0,0};
int n,m,sx,sy,x,y;
int MU[maxn][maxn];
char mp[maxn][maxn];
std::deque<int>Qx,Qy;
int main() {
qr(n);qr(m);qr(sx);qr(sy);qr(x);qr(y);
for(rg int i=1;i<=n;++i) scanf("%s",mp[i]+1);
memset(MU,0x3f,sizeof MU);
MU[sx][sy]=0; Qx.push_front(sx);Qy.push_front(sy);
while(!Qx.empty()) {
int hx=Qx.front(),hy=Qy.front();Qx.pop_front();Qy.pop_front();
for(rg int i=0;i<4;++i) {
int dx=hx+fx[i],dy=hy+fy[i];
if((dx > n) || (dy > m) || (!dx) || (!dy) || (mp[dx][dy] == '*') || (MU[dx][dy] <= MU[hx][hy]+fv[i])) continue;
MU[dx][dy]=MU[hx][hy]+fv[i];
if(i) {Qx.push_front(dx);Qy.push_front(dy);}
else {Qx.push_back(dx);Qy.push_back(dy);}
}
}
rg int _ans=0;
for(rg int i=1;i<=n;++i) {
for(rg int j=1;j<=m;++j) if(mp[i][j] != '*') {
if((MU[i][j] <= y) && ((MU[i][j]-j+sy) <= x)) ++_ans;
}
}
qw(_ans,'\n',true);
return 0;
}
Summary
当题设需要最小化多个变量时,不妨考虑变量间的相关关系,从此转化成单变量的极值问题。
当边权只有\(0\)和\(1\)的时候,可以考虑使用\(0/1bfs\),省去dij的log。
【极值问题】【CF1063B】 Labyrinth的更多相关文章
- cf1063B Labyrinth (bfs)
可以证明,如果我搜索的话,一个点最多只有两个最优状态:向左剩余步数最大时和向右剩余步数最大时 然后判一判,bfs就好了 dfs会T惨... #include<bits/stdc++.h> ...
- CF1063B Labyrinth
大家一起膜Rorshach. 一般的$bfs$会造成有一些点访问不到的情况,在$system\ test$的时候会$WA40$(比如我……). 发现这张地图其实是一个边权只有$0/1$的图,我们需要计 ...
- $CF1063B\ Labyrinth$ $01$最短路/$01BFS$
\(Des\) 有一个网格图,上面的格子分为空地和障碍,障碍是不可以走的.现在从给定的起点出发开始到处乱走,最多可以往左走\(l\)次,往右走\(r\)次.求可能到达的点数. \(Sol\) 如果只限 ...
- 题解 CF1063B 【Labyrinth】
题解 CF1063B [Labyrinth] 完了我发现我做CF的题大部分思路都和别人不一样qwq 这道题其实很水,不至于到紫题 我们只要bfs一下,向四个方向剪下枝,就A了(好像还跑的蛮快?) 是一 ...
- 2014百度之星资格赛 1004:Labyrinth(DP)
Labyrinth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- ural 1145. Rope in the Labyrinth
1145. Rope in the Labyrinth Time limit: 0.5 secondMemory limit: 64 MB A labyrinth with rectangular f ...
- [POJ1383]Labyrinth
[POJ1383]Labyrinth 试题描述 The northern part of the Pyramid contains a very large and complicated labyr ...
- timus 1033 Labyrinth(BFS)
Labyrinth Time limit: 1.0 secondMemory limit: 64 MB Administration of the labyrinth has decided to s ...
- poj 1383 Labyrinth
题目连接 http://poj.org/problem?id=1383 Labyrinth Description The northern part of the Pyramid contains ...
随机推荐
- tpo-09 C1 Advice on a term paper's topic
第 1 段 1.Listen to a conversation between a student and her professor. 请听一段一名学生和教授讨论的对话. 第 2 段 1.Befo ...
- Java开发工程师(Web方向) - 01.Java Web开发入门 - 第5章.Git
第5章--Git 版本控制简介 VCS (version control system) 版本控制系统:记录若干文件的修订记录的系统,帮助查阅/回到某个历史版本 LVCS本地 CVCS集中式(Cent ...
- springmvc项目,浏览器报404错误的问题
问题描述: 建立了web工程,配置pom.xml,web.xml,编写controller类,在spring-mvc-servlet.xml文件中指定开启注解和扫描的包位置<mvc:annota ...
- openstack多region介绍与实践---转
概念介绍 所谓openstack多region,就是多套openstack共享一个keystone和horizon.每个区域一套openstack环境,可以分布在不同的地理位置,只要网络可达就行.个人 ...
- HADOOP docker(一):安装hadoop实验集群(略操蛋)
一.环境准备 1.1.机器规划 主机名 别名 IP 角色 9321a27a2b91 hadoop1 172.17.0.10 NN1 ZK RM 7c3a3c9cd595 hadoo ...
- 上层应用与wpa_supplicant,wpa_supplicant与kernel 相关socket创建交互分析
单独拿出来,分析以下上层应用与wpa_supplicant wpa_supplicant与kernel 的socket交互. 关联上层应用与wpa_supplicant的socket的创建.连接流 ...
- 软件工程课堂作业(十一)——NABC分析
一.团队开发项目:基于Android的重力感应的解锁APP 二.项目特点:区别于一般解锁软件用开机按钮开锁解锁,我们的重力解锁软件根据动作实现解锁,减少了开机按钮的使用频率,提高寿命. 三.NABC分 ...
- 福大软工1816:Alpha(7/10)
Alpha 冲刺 (7/10) 队名:Jarvis For Chat 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务: 文字/口头描述: 1.完成 ...
- android入门 — ListView
ListView主要是用来解决大量数据展示的问题,它的用途很广泛,几乎所有的app都会用到,比如说知乎.今日头条.微博.通讯录等. ListView允许用户通过上下滑动的方式将屏幕外的数据滚动到屏幕中 ...
- lintcode-144-交错正负数
144-交错正负数 给出一个含有正整数和负整数的数组,重新排列成一个正负数交错的数组. 注意事项 不需要保持正整数或者负整数原来的顺序. 样例 给出数组[-1, -2, -3, 4, 5, 6],重新 ...