题目

一个\(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 锻炼身体的更多相关文章

  1. [JZOJ 5905] [NOIP2018模拟10.15] 黑暗之魂(darksoul) 解题报告 (拓扑排序+单调队列+无向图基环树)

    题目链接: http://172.16.0.132/senior/#main/show/5905 题目: oi_juruo热爱一款名叫黑暗之魂的游戏.在这个游戏中玩家要操纵一名有 点生命值的无火的余灰 ...

  2. bzoj2500幸福的道路 树形dp+单调队列

    2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 434  Solved: 170[Submit][Status][Discuss ...

  3. 【bzoj2500】幸福的道路 树形dp+单调队列

    Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...

  4. bzoj2093: [Poi2010]Frog(单调队列,倍增)

    2093: [Poi2010]Frog Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 568  Solved: 186[Submit][Status] ...

  5. (noip模拟二十一)【BZOJ2500】幸福的道路-树形DP+单调队列

    Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...

  6. BestCoder Round #89 B题---Fxx and game(单调队列)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5945     问题描述 输入描述 输出描述 输入样例 输出样例 题意:中文题,不再赘述: 思路:  B ...

  7. 单调队列 && 斜率优化dp 专题

    首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...

  8. FZU 1914 单调队列

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=1914 题意: 给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个 ...

  9. BZOJ 1047 二维单调队列

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 题意:见中文题面 思路:该题是求二维的子矩阵的最大值与最小值的差值尽量小.所以可以考 ...

  10. 【BZOJ3314】 [Usaco2013 Nov]Crowded Cows 单调队列

    第一次写单调队列太垃圾... 左右各扫一遍即可. #include <iostream> #include <cstdio> #include <cstring> ...

随机推荐

  1. 通过 saltstack 批量更新 SSL 证书

    哈喽大家好,我是咸鱼. 之前写过两篇关于 SSL 过期巡检脚本的文章: SSL 证书过期巡检脚本 SSL 证书过期巡检脚本(Python 版) 这两篇文章都是讲如何通过脚本去自动检测 SSL 过期时间 ...

  2. RibbonRoutingFilter是如何工作的

    在讲RibbonRoutingFilter是如何工作之前,也有一些比较重要的类需要去提前了解. 重要的类 RequestContext 请求上下文,用于存储线程中对应的请求以及响应 public cl ...

  3. 【Azure Redis 缓存】C#程序是否有对应的方式来优化并缩短由于 Redis 维护造成的不可访问的时间

    问题描述 C#程序是否有对应的方式来优化并缩短由于 Redis 维护造成的不可访问的时间? Redis维护说明: Redis 服务维护时,会把副本节点提升为主节点,且旧主节点关闭现有连接时,这个时候, ...

  4. STM32标准库时钟树设置

    STM32的系统时钟大致可以分为以下流程 1.外部晶振提供HSE高速外部时钟信号 2.HSE经过PLL锁相环,倍频后得到PLL_CLK高速内部时钟信号 3.PLL_CLK经过分频后得到系统时钟SYSC ...

  5. 如何提高UI自动化稳定性?

    1尽量使用相对路径的xpath表达式定位元素 2查找元素优先使用显示等待方式 3用例与用例之间避免产生依赖,用例可以单独运行 4用例执行结束之后要对测试场景进行还原,避免影响到其他用例的执行 5脚本执 ...

  6. Java package(包) +import 关键字(2)

    1 package com.bytezero.exer; 2 3 import java.lang.reflect.Field; 4 5 //import java.util.ArrayList; 6 ...

  7. 手机端User-agent

    转载: http://www.fynas.com/ua 设备 系统 浏览器 User-Agent vivo X20Plus A Android 手机百度 Mozilla/5.0 (Linux; And ...

  8. (广州南沙)vue知识点整理2021,主要是防止忘记防备快速翻看

         ///////////////////////////   vue 中使用路由技巧:router //////////////////////////////// 写笔记说明,之前在江门工作 ...

  9. pollute 污染 pol=por=pro 向前 lut=释放 结合ps软件里面lut概念记忆

    pollute 污染 pol = por = pro = 向前 lut = 释放 (ps里面有lut的概念) e 动词 向前释放 -> 污染 弄脏 简单记忆 poll / ute poll - ...

  10. Google Chart API学习(二)

    书接上回: combo-charts: <html> <head> <script type="text/javascript" src=" ...