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 ...
随机推荐
- ABAP-BarCode-3-调用第三方控件BarTender实现打印
1.BarTender软件安装及注册 2.BarTender设置好打印模板 3.ABAP生成TXT文件放置FTP服务器指定文件夹 4.BarTender轮询FTP服务器文件夹中的TXT,并按照模板打印 ...
- eclipse在运行main方法时在console里面报内存溢出的错误解决办法
修改JVM的配置. window-->preferences-->Java-->installedJres选中使用的jdk/jre版本 点击右边的edit在弹出的对话框中的[Defa ...
- objective C, parse json时注意事项
例: dict为从API请求返回的json调用 NSJSONSerialization JSONObjectWithData:方法得到的NSDictionary实例. 当执行以下语句时linkStri ...
- Haskell语言学习笔记(20)IORef, STRef
IORef 一个在IO monad中使用变量的类型. 函数 参数 功能 newIORef 值 新建带初值的引用 readIORef 引用 读取引用的值 writeIORef 引用和值 设置引用的值 m ...
- Filter接口编写过滤器
Filter,过滤器,顾名思义,即是对数据等的过滤,预处理过程.为什么要引入过滤器呢?在平常访问网站的时候,有时候发一些敏感的信息,发出后显示时 就会将敏感信息用*等字符替代,这就是用过滤器对信息 ...
- RabbitMQ 高可用集群搭建
面向EDA(事件驱动架构)的方式来设计你的消息 AMQP routing key的设计 RabbitMQ cluster搭建 Mirror queue policy设置 两个不错的RabbitMQ p ...
- Android中MD5加密
最近项目中遇到MD5加密,代码很简单,又是死代码,不过要注意当长度不足32的时候要补个0.下面是具体代码,直接拷贝就能用. public static String getMD5(String str ...
- 第八章 高级搜索树 (b2)B-树:结构
- VS IIS 注册 以及IIS浏览提示无权限访问
VS2008 IIS重新注册2008-11-21 9:06无法显示XML页--名称以无效字符开头2008-10-17 15:19无法显示XML页--名称以无效字符开头.iis处理资源时出错的解决办法2 ...
- 【转】VS2012 中文版转英文版 英文版转中文版 界面语言切换
[1]下载VS2012的语言包,各种语言包都有,下载对应的即可. 微软官网衔接地址:vs2012 语言包 http://www.microsoft.com/zh-CN/download/detail ...