#单调队列#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> ...
随机推荐
- 【Android逆向】frida 破解 滚动的天空
1. apk 安装到手机中 2. 玩十次之后,会提示 充值 3. adb shell dumpsys window | grep mCurrentFocus 查看一些当前activity是哪一个 是 ...
- Taro兼容h5的一些小问题
背景:先做了小程序,现在需要兼容h5 问题一:Image组件mode属性设置为aspectFill在h5上没效果 解决方法:给img加样式 object-fit: cover (例子如下) // js ...
- 【ACM专项练习#02】整行字符串、输入vector、打印图形、处理n组数据以及链表操作等
输入整行字符串 平均绩点 题目描述 每门课的成绩分为A.B.C.D.F五个等级,为了计算平均绩点,规定A.B.C.D.F分别代表4分.3分.2分.1分.0分. 输入 有多组测试样例.每组输入数据占一行 ...
- 【LeetCode贪心#06】加油站(股票买卖变种)
加油站 力扣题目链接(opens new window) 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升. 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 ...
- Java是解释型语言么
基础概念 JVM虚拟机会将.java类文件编译成.class文件--字节码文件,这大家都知道. 代码运行时还需要将.class字节码文件翻译成机器码才能执行. 解释执行:将编译好的字节码一行一行地翻译 ...
- 【Azure 应用服务】App Service - 在修改应用服务计划的页面中,为什么无法查看到同一个资源组下面的其他应用服务计划(App Service Plan)呢?
问题描述 在App Service的门户上,可以通过"Change App Service Plan"来改变当前App Service所属的应用服务计划(App Service P ...
- 分布式事务框架seata入门
一.简介 在近几年流行的微服务架构中,由于对服务和数据库进行了拆分,原来的一个单进程本地事务变成多个进程的本地事务,这时要保证数据的一致性,就需要用到分布式事务了.分布式事务的解决方案有很多,其中国内 ...
- supervisor的使用与配置说明
Supervisor 是用 Python 开发的一套通用的 进程管理程序 ,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启. 一. 安装 1.1 安装 # 根目录下 ...
- C++左值右值完美转发转移
左值(Lvalue)与右值(Rvalue) 英文含义: 左值(Lvalue):Locator value,意味着它指向一个具体的内存位置. 右值(Rvalue):Read value,指的是可以读取的 ...
- rst文件查看(Sphinx)
reStructuredText ( RST . ReST 或 reST )是一种用于文本数据的文件格式,主要用于 Python 编程语言社区的技术文档. 在下载了别人的Python源文件里面有rst ...