题目大意:给定一个m*n的地图,一些点有障碍物,钢琴初始在一个点,每一个时间段能够选择向给定的方向移动一段距离,求最长路径长

朴素DP的话,我们有T个时间段,每一个时间段有m*n个点,n个时间,一定会超时

考虑到一个时间段全部的更新操作都是同样的,我们能够考虑单调队列优化

设队尾为(x,y),新插入的点为(x',y'),那么当Distance( (x,y) , (x',y') ) <= f[x'][y'] - f[x][y]时,(x,y)可被删掉

四遍单调队列就可以 O(T*m*n)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 210
using namespace std;
typedef pair<int,int> abcd;
int n,m,k,ans;
char map[M][M];
int f[M][M],g[M][M];
abcd q[M];int r,h;
inline int Distance(const abcd &x,const abcd &y)
{
return abs(x.first-y.first)+abs(x.second-y.second);
}
inline void Insert(const abcd &x)
{
while( r!=h && Distance(x,q[r]) <= f[x.first][x.second] - f[q[r].first][q[r].second] )
--r;
q[++r]=x;
}
inline int Get_Ans(const abcd &x,int len)
{
while( r!=h && Distance(q[h+1],x)>len )
++h;
if(r==h)
return 0xefefefef;
return f[q[h+1].first][q[h+1].second]+Distance(q[h+1],x);
}
void U(int len)
{
int i,j;
for(j=1;j<=n;j++)
{
r=h=0;
for(i=m;i;i--)
if(map[i][j]=='.')
{
abcd p(i,j);
g[i][j]=max( f[i][j] , Get_Ans(p,len) );
Insert(p);
}
else
r=h=0;
}
memcpy(f,g,sizeof f);
}
void D(int len)
{
int i,j;
for(j=1;j<=n;j++)
{
r=h=0;
for(i=1;i<=m;i++)
if(map[i][j]=='.')
{
abcd p(i,j);
g[i][j]=max( f[i][j] , Get_Ans(p,len) );
Insert(p);
}
else
r=h=0;
}
memcpy(f,g,sizeof f);
}
void L(int len)
{
int i,j;
for(i=1;i<=m;i++)
{
r=h=0;
for(j=n;j;j--)
if(map[i][j]=='.')
{
abcd p(i,j);
g[i][j]=max( f[i][j] , Get_Ans(p,len) );
Insert(p);
}
else
r=h=0;
}
memcpy(f,g,sizeof f);
}
void R(int len)
{
int i,j;
for(i=1;i<=m;i++)
{
r=h=0;
for(j=1;j<=n;j++)
if(map[i][j]=='.')
{
abcd p(i,j);
g[i][j]=max( f[i][j] , Get_Ans(p,len) );
Insert(p);
}
else
r=h=0;
}
memcpy(f,g,sizeof f);
}
int main()
{
int i,j,x,y,z;
cin>>m>>n>>x>>y>>k;
for(i=1;i<=m;i++)
scanf("%s",map[i]+1);
memset(f,0xef,sizeof f);
memset(g,0xef,sizeof g);
f[x][y]=0;
for(i=1;i<=k;i++)
{
scanf("%d%d%d",&x,&y,&z);
switch(z)
{
case 1:U(y-x+1);break;
case 2:D(y-x+1);break;
case 3:L(y-x+1);break;
case 4:R(y-x+1);break;
}
}
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
ans=max(ans,f[i][j]);
cout<<ans<<endl;
}

BZOJ 1499 NOI2005 瑰丽华尔兹 单调队列的更多相关文章

  1. BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP

    BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...

  2. bzoj 1499 [NOI2005]瑰丽华尔兹——单调队列优化dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 简单的单调队列优化dp.(然而当时却WA得不行.今天总算填了坑) 注意滚动数组赋初值应 ...

  3. bzoj1499[NOI2005]瑰丽华尔兹 单调队列优化dp

    1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 1802  Solved: 1097[Submit][Status ...

  4. 【BZOJ1499】[NOI2005]瑰丽华尔兹 单调队列+DP

    [BZOJ1499][NOI2005]瑰丽华尔兹 Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是 ...

  5. ●BZOJ 1499 [NOI2005]瑰丽华尔兹

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1499 题解: 单调队列优化DP 定义 dp[t][x][y] 表示第t个时间段之后,处在(x ...

  6. bzoj1499 [NOI2005]瑰丽华尔兹——单调队列优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 朴素DP方程很好想,以右移为例,就是 f[i][x][y]=max(f[i][x][y ...

  7. bzoj 1499: [NOI2005]瑰丽华尔兹【dp+单调队列】

    设f[a][i][j]为第a段时间结束时在(i,j)位置的最长滑行距离,转移很好想,就是分四个方向讨论,然后枚举这段时间的滑行长度取个max即可 但是这样是O(n^4)的,考虑优化 发现同一行或列,取 ...

  8. NOI2005瑰丽华尔兹

    1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 893  Solved: 508[Submit][Status] ...

  9. [Bzoj1499][NOI2005]瑰丽华尔兹[简单DP]

    1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 1714  Solved: 1042[Submit][Status ...

随机推荐

  1. poj1236 Network of Schools【强连通分量(tarjan)缩点】

    转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4316263.html  ---by 墨染之樱花 [题目链接]http://poj.org/pr ...

  2. 【node.js】本地模式安装express:'express' 不是内部或外部命令,也不是可运行的程序或批处理文件。

    今天闲来无事想起了node.js,因此到网上下载了一个node.js的安装程序进行安装.其中: 安装程序:node-v0.11.13-x64.msi PC系统:Windows 7 自定义安装路径:D: ...

  3. photoshop使用注意事项

    CMYK 与 RGB 任何网络图片都会以RGB模式显示图片: 数码图片以RGB模式被捕捉,因此应在RGB模式下编辑: 大部分工具和滤镜只能在RGB模式下使用: RGB模式和CMYK模式之间不能实现无损 ...

  4. Mac 终端命令运行java

    链接地址:http://www.cnblogs.com/wangrui-techbolg/archive/2012/12/29/2839047.html 由于mac已经装好java环境,所以直接课运行 ...

  5. [Swust OJ 795]--Penney Game

    题目链接:http://acm.swust.edu.cn/problem/795/ Time limit(ms): 1000 Memory limit(kb): 65535   Description ...

  6. 添加站点图标: 为SAE上的WordPress站点添加自己的Favicon

    由于插件 Jetpack的"添加站点图标"功能有问题, 无法从本地上传ico文件到SAE的Storage. 因此需要手动添加站点图标. Step 1: 制作或下载自己的ico文件, ...

  7. hdu 4790 Just Random 神奇的容斥原理

    /** 大意: 给定[a,b],[c,d] 在这两个区间内分别取一个x,y 使得 (x+y)%p = m 思路:res = f(b,d) -f(b,c-1)-f(a-1,d)+f(a-1,c-1); ...

  8. 链接分析算法之:HITS算法

    链接分析算法之:HITS算法     HITS(HITS(Hyperlink - Induced Topic Search) ) 算法是由康奈尔大学( Cornell University ) 的Jo ...

  9. poj 2245 Lotto(dfs)

    题目链接:http://poj.org/problem?id=2245 思路分析:无重复元素组合组合问题,使用暴力枚举法,注意剪枝条件. 代码如下: #include <iostream> ...

  10. 最新Android ADT, SDK, SDK_tool等官方下载说明(及时更新)

    1.Android SDK starter package SDK starter package http://dl.google.com/android/installer_r08-windows ...