#单调队列#JZOJ 1753 锻炼身体
题目
一个\(n*m\)的矩阵,有些格子不能经过,有\(k\)个时段,
要么停留某个格子,要么沿时段规定的方向移动,问最多能够移动多少次
\(n,m,k\leq 200\)
分析
题目已经提示了\(O(nmk)\),考虑朴素的搜索为\(O(n^2mk)\)的,
考虑用单调队列优化此过程使复杂度降至1s内
代码
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define rr register
using namespace std;
const int N=201; struct rec{int l,r,opt;}ques[N];
int n,m,zx,zy,Q,q[N],dp[N][N],f[N][N],a[N][N],ans;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline signed max(int a,int b){return a>b?a:b;}
bool cmp(rec x,rec y){return x.l<y.l;}
signed main(){
n=iut(),m=iut(),zx=iut(),zy=iut(),Q=iut();
memset(dp,0xcf,sizeof(dp)),dp[zx][zy]=0;
for (rr int i=1;i<=n;++i)
for (rr int j=1;j<=m;++j){
rr char c=getchar();
while (c!='.'&&c!='x') c=getchar();
a[i][j]=c=='.';
}
for (rr int i=1;i<=Q;++i)
ques[i]=(rec){iut(),iut(),iut()};
sort(ques+1,ques+1+Q,cmp);
for (rr int T=1;T<=Q;++T){
rr int len=ques[T].r-ques[T].l+1,head,tail;
memcpy(f,dp,sizeof(dp));
switch (ques[T].opt){
case 1:{
for (rr int j=1;j<=m;++j){
head=1,tail=0;
for (rr int i=n;i>=1;--i){
if (!a[i][j]){
head=1,tail=0;
continue;
}
while (head<=tail&&i+len<q[head]) ++head;
while (head<=tail&&f[q[tail]][j]+q[tail]<=f[i][j]+i) --tail;
if (f[i][j]>=0) q[++tail]=i;
if (head<=tail) dp[i][j]=max(dp[i][j],f[q[head]][j]+q[head]-i);
}
}
break;
}
case 2:{
for (rr int j=1;j<=m;++j){
head=1,tail=0;
for (rr int i=1;i<=n;++i){
if (!a[i][j]){
head=1,tail=0;
continue;
}
while (head<=tail&&q[head]+len<i) ++head;
while (head<=tail&&f[q[tail]][j]-q[tail]<=f[i][j]-i) --tail;
if (f[i][j]>=0) q[++tail]=i;
if (head<=tail) dp[i][j]=max(dp[i][j],f[q[head]][j]+i-q[head]);
}
}
break;
}
case 3:{
for (rr int i=1;i<=n;++i){
head=1,tail=0;
for (rr int j=m;j>=1;--j){
if (!a[i][j]){
head=1,tail=0;
continue;
}
while (head<=tail&&j+len<q[head]) ++head;
while (head<=tail&&f[i][q[tail]]+q[tail]<=f[i][j]+j) --tail;
if (f[i][j]>=0) q[++tail]=j;
if (head<=tail) dp[i][j]=max(dp[i][j],f[i][q[head]]+q[head]-j);
}
}
break;
}
case 4:{
for (rr int i=1;i<=n;++i){
head=1,tail=0;
for (rr int j=1;j<=m;++j){
if (!a[i][j]){
head=1,tail=0;
continue;
}
while (head<=tail&&q[head]+len<j) ++head;
while (head<=tail&&f[i][q[tail]]-q[tail]<=f[i][j]-j) --tail;
if (f[i][j]>=0) q[++tail]=j;
if (head<=tail) dp[i][j]=max(dp[i][j],f[i][q[head]]+j-q[head]);
}
}
break;
}
}
}
for (rr int i=1;i<=n;++i)
for (rr int j=1;j<=m;++j)
ans=max(ans,dp[i][j]);
return !printf("%d",ans);
}
#单调队列#JZOJ 1753 锻炼身体的更多相关文章
- [JZOJ 5905] [NOIP2018模拟10.15] 黑暗之魂(darksoul) 解题报告 (拓扑排序+单调队列+无向图基环树)
题目链接: http://172.16.0.132/senior/#main/show/5905 题目: oi_juruo热爱一款名叫黑暗之魂的游戏.在这个游戏中玩家要操纵一名有 点生命值的无火的余灰 ...
- bzoj2500幸福的道路 树形dp+单调队列
2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 434 Solved: 170[Submit][Status][Discuss ...
- 【bzoj2500】幸福的道路 树形dp+单调队列
Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...
- bzoj2093: [Poi2010]Frog(单调队列,倍增)
2093: [Poi2010]Frog Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 568 Solved: 186[Submit][Status] ...
- (noip模拟二十一)【BZOJ2500】幸福的道路-树形DP+单调队列
Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...
- BestCoder Round #89 B题---Fxx and game(单调队列)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5945 问题描述 输入描述 输出描述 输入样例 输出样例 题意:中文题,不再赘述: 思路: B ...
- 单调队列 && 斜率优化dp 专题
首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...
- FZU 1914 单调队列
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1914 题意: 给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个 ...
- BZOJ 1047 二维单调队列
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 题意:见中文题面 思路:该题是求二维的子矩阵的最大值与最小值的差值尽量小.所以可以考 ...
- 【BZOJ3314】 [Usaco2013 Nov]Crowded Cows 单调队列
第一次写单调队列太垃圾... 左右各扫一遍即可. #include <iostream> #include <cstdio> #include <cstring> ...
随机推荐
- 学习go语言编程之流程控制
Golang支持如下4种流程控制语句: 条件语句:if,else和else if 选择语句:switch,case和select 循环语句:for,range 跳转语句:goto 条件语句 示例代码: ...
- GROW模型:世界上最常用的教练模型(**案例及全套表单)
http://www.360doc.com/content/21/0812/18/76566468_990752480.shtml <高绩效教练>一书的核心方法就是GROW模型. GROW ...
- 微服务程序运行步骤及nameko入门案例
首先一个微服务应用程序需要有服务的生产者和服务的消费者,另外还需要一个注册中心来管理和调度服务 1.服务提供方,即生产者启动服务,并将服务提交到注册中心注册服务 2.服务需求方,即消费者连接到注册中心 ...
- django项目中使用nginx+fastdfs上传图片和使用图片的流程
自定义文件存储类 1.先弄清楚django中默认的上传文件存储FileSystemStorage类 https://docs.djangoproject.com/zh-hans/2.2/ref/fil ...
- 【Azure 应用服务】Azure Function HTTP Trigger 遇见奇妙的500 Internal Server Error: Failed to forward request to http://169.254.130.x
问题描述 使用 Azure Funciton App,在本地运行完全成功的Python代码,发布到Azure Function就出现了500 Internal Server Error. 而且错误消 ...
- 【Azure Developer】使用 Azure PowerShell 执行 Azure 表存储操作时遇见的4个问题
要使用PowerShell操作Azure的表存储,需要经过以下步骤: 1:必须安装 Az 和 AzTable 模块.安装命令为: #安装 Az 模块 Install-Module -Name Az - ...
- Taurus.MVC WebMVC 入门开发教程6:路由配置与路由映射
前言: 在本篇 Taurus.MVC WebMVC 入门开发教程的第六篇文章中, 我们将讨论如何配置路由并映射到控制器和操作方法. 路由是决定应用程序如何响应客户端请求的重要组成部分,因此在 Web ...
- 2023 年值得一读的技术文章 | NebulaGraph 技术社区
在之前的产品篇,我们了解到了 NebulaGraph 内核及周边工具在 2023 年经历了什么样的变化.伴随着这些特性的变更和上线,在[文章]博客分类中,一篇篇的博文记录下了这些功能背后的设计思考和研 ...
- 深入解析ASP.NET Core MVC应用的模块化设计[上篇]
ASP.NET Core MVC的"模块化"设计使我们可以构成应用的基本单元Controller定义在任意的模块(程序集)中,并在运行时动态加载和卸载.这种为"飞行中的飞 ...
- 在vue3中使用openlayers3实现track轨迹动画
网上太多资料代码,抄来抄去,而且版本也是v5.x版本的,部分API已经弃用 基础知识不多说,直接讲重点 三个关键变量 // 记录开始动画的时间 const startTime = ref(0); // ...