2018.09.10 bzoj1499: [NOI2005]瑰丽华尔兹(单调队列优化dp)
传送门
单调队列优化dp好题。
这题其实很简单。
我们很容易想到一个O(T∗n∗m)" role="presentation" style="position: relative;">O(T∗n∗m)O(T∗n∗m)的算法,就是以时间点与坐标转移。
然后我们可以改成时间段和坐标转移。
时间复杂度O(k∗n3)" role="presentation" style="position: relative;">O(k∗n3)O(k∗n3)
方程是:
f[k][x][y]=max(f[k−1][x′][y′]+dist(x,y,x′,y′))" role="presentation" style="position: relative;">f[k][x][y]=max(f[k−1][x′][y′]+dist(x,y,x′,y′))f[k][x][y]=max(f[k−1][x′][y′]+dist(x,y,x′,y′))
由于(x,y)" role="presentation" style="position: relative;">(x,y)(x,y)跟(x′,y′)" role="presentation" style="position: relative;">(x′,y′)(x′,y′)一定在同一行/列,因此对于每一个方向都可以用单调队列把复杂度优化掉一个n。
但这样空间不是最优的。
于是我模仿大佬的写法改成了滚动数组的写法(真难写)。
代码:
#include<bits/stdc++.h>
#define N 205
using namespace std;
int n,m,sx,sy,K,ans,f[N][N];
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
struct Node{int f,len;}q[N];
char mp[N][N];
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
inline int max(int a,int b){return a>b?a:b;}
inline void solve(int xx,int yy,int len,int dir){
int hd=1,tl=0;
for(int i=1;xx&&xx<=n&&yy&&yy<=m;++i,xx+=dx[dir],yy+=dy[dir]){
if(mp[xx][yy]=='x')hd=1,tl=0;
else{
while(hd<=tl&&q[tl].f-q[tl].len<f[xx][yy]-i)--tl;
q[++tl]=(Node){f[xx][yy],i};
if(q[tl].len-q[hd].len>len)++hd;
f[xx][yy]=q[hd].f-q[hd].len+i,ans=max(ans,f[xx][yy]);
}
}
}
int main(){
n=read(),m=read(),sx=read(),sy=read(),K=read();
for(int i=1;i<=n;++i)scanf("%s",mp[i]+1);
memset(f,-0x3f,sizeof(f)),f[sx][sy]=0;
for(int i=1;i<=K;++i){
int s=read(),t=read(),dir=read()-1,len=t-s+1;
if(!dir)for(int j=1;j<=m;++j)solve(n,j,len,dir);
else if(dir==1)for(int j=1;j<=m;++j)solve(1,j,len,dir);
else if(dir==2)for(int j=1;j<=n;++j)solve(j,m,len,dir);
else for(int j=1;j<=n;++j)solve(j,1,len,dir);
}
cout<<ans;
return 0;
}
2018.09.10 bzoj1499: [NOI2005]瑰丽华尔兹(单调队列优化dp)的更多相关文章
- bzoj1499[NOI2005]瑰丽华尔兹 单调队列优化dp
1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 1802 Solved: 1097[Submit][Status ...
- bzoj1499 [NOI2005]瑰丽华尔兹——单调队列优化DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 朴素DP方程很好想,以右移为例,就是 f[i][x][y]=max(f[i][x][y ...
- BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP
BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...
- 2018.09.10 bzoj1855: [Scoi2010]股票交易(单调队列优化dp)
传送门 单调队列优化dp好题. 有一个很明显的状态设置是f[i][j]表示前i天完剩下了j分股票的最优值. 显然f[i][j]可以从f[i-w-1][k]转移过来. 方程很好推啊. 对于j<kj ...
- bzoj 1499 [NOI2005]瑰丽华尔兹——单调队列优化dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 简单的单调队列优化dp.(然而当时却WA得不行.今天总算填了坑) 注意滚动数组赋初值应 ...
- 2018.09.23 孙悟空大战鲤鱼精(单调队列优化dp)
描述 孙悟空大战鲤鱼精,孙悟空在通天河遇到鲤鱼精,他嫉恶如仇,看见妖精就手痒(忘了自己是妖精).但是鲤鱼精知道孙悟空的厉害,在孙悟空来到通天河,鲤鱼精就跑到了河对面.于是孙悟空就去追鲤鱼精. 我们可以 ...
- 【BZOJ1499】[NOI2005]瑰丽华尔兹 单调队列+DP
[BZOJ1499][NOI2005]瑰丽华尔兹 Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是 ...
- BZOJ 1499 NOI2005 瑰丽华尔兹 单调队列
题目大意:给定一个m*n的地图,一些点有障碍物,钢琴初始在一个点,每一个时间段能够选择向给定的方向移动一段距离,求最长路径长 朴素DP的话,我们有T个时间段,每一个时间段有m*n个点,n个时间,一定会 ...
- bzoj1499: [NOI2005]瑰丽华尔兹&&codevs1748 单调队列优化dp
这道题 网上题解还是很多很好的 强烈推荐黄学长 码风真的好看 神犇传送门 学习学习 算是道单调队列优化dp的裸题吧 #include<cstdio> #include<cstring ...
随机推荐
- kindeditor asp.net 模板问题 clientidmode="Static"
1.为了防止asp.net 修改 id, 必须加上clientidmode="Static" . 2.关于 kindeditor 的脚本,写在master里面,如下(我要骂人了 ...
- EventUtil——跨浏览器的事件对象
. 首页 博客园 联系我 前言:什么是EventUtil?. EventUtil对象全见. addHandler方法. removeHandler方法. event对象与getEvent方法. tar ...
- JPQL和SQL的比较
前言 在JAVA EE中,JPQL是专门为Java 应用程序访问和导航实体实例设计的.Java Presistence Query Language(JPQL),java持久性查询语言.它是JPA规范 ...
- HTTPS 路径配置
1: 首先安装 fiddlercertmaker.exe 文件 2:Tools -> HTTPS 3: Connections 勾中Allow remote computer to ...
- bat 笔记 二
@echo off echo 等待 ping -n 5 127.1 >null cls echo 我爱嘉怡 pause >null 第一条利用echo关键字关闭路径面板 第二条利用echo ...
- as3 air 保存文本内容的换行
private function newData() { var str:String="<root>"; for(var i in charCode_arr) { s ...
- H5-BLOB
BLOB 对象为h5的产物.普遍用于传输或者存储数据. <a 标签的新属性 download 表明 此a标签点击后,不是href跳转而是要下载.download的内容表示下载文件名.但是目前部分 ...
- python常见异常提示
PEP8 expected 2 blank lines, found 1 定义方法时,出现期望是2个空白行,但是实际检测到是1个.方法与上面内容间隔期望为两个换行符 PEP8 This diction ...
- 基于OpenGL编写一个简易的2D渲染框架-07 鼠标事件和键盘事件
这次为程序添加鼠标事件和键盘事件 当检测到鼠标事件和键盘事件的信息时,捕获其信息并将信息传送到需要信息的对象处理.为此,需要一个可以分派信息的对象,这个对象能够正确的把信息交到正确的对象. 实现思路: ...
- 迷你MVVM框架 avalonjs 学习教程14、事件绑定
之前的章节许多示例代码也或多或少地展示了如何使用ms-click来绑定事件了.能直接在模板上绑定是事件,这也是静态模板与动态绑定的一大区别.ms-click不是简单的onclick的别名,它在内部屏蔽 ...