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 ...
随机推荐
- leetcode500
public class Solution { public string[] FindWords(string[] words) { var list1 = new List<char> ...
- Devexpress 百分号显示格式
百分号:{0:P}表示显示为百分号模式.如数据源中为0.5.表示出来为50%
- css上下或者上中下 自适应布局
方法就是头部不变,中间和底部绝对定位 *{ margin: ; padding: ; } div{ text-align: center; font-size: 30px; } .header,.fo ...
- 使用FIO测试磁盘iops
我们如何衡量一个存储的性能呢?IOPS(Input/Output OperationsPer Second),即每秒进行读写(I/O)操作的次数是国际上通用的存储性能衡量标准,IOPS越高意味着在同一 ...
- 磁盘IO过高时的处理办法
针对系统中磁盘IO负载过高的指导性操作 主要命令:echo deadline > /sys/block/sda/queue/scheduler 注:以下的内容仅是提供参考,如果磁盘IO确实比较大 ...
- cprogram作业
刘金福 SA17225205 第三次作业 url:http://blog.csdn.net/liu896749150/article/details/78176433 学号:SA17225404 姓名 ...
- 正则表达式(Java,C#,C++)
课题 使用正则表达式匹配字符串 使用正则表达式 "\d{3}-(\d{4})-\d{2}" 匹配字符串 "123-4567-89" 返回匹配结果:'" ...
- sessionStorage和localStorage
html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage. sessionStorage用于本地存储一个会话(session)中的数据,这些数据只 ...
- $.ajax dataType设置为json 回调函数不执行
请求方式如下: $.xpost = function (url, data) { return $.ajax({ url: url, type: "POST", dataType: ...
- 部分真验货客户未取进FP IN_SALES_ORDER表有数据,前台规划页面没显示
描述:部分真验货客户未取进FP,检查发现IN_SALES_ORDER表有数据630\600\610行项目数据,但前台只显示630数据,600和610前台没有显示 1.查看IN_SALES_ORDER表 ...