BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜,但不同时刻倾斜方向可能不同:具体来说,当时间处于区间\([l_i, r_i]\)内时,向\(d_i\)方向倾斜(输入保证给出的所有区间是连续的). 海上钢琴师1900的钢琴在这块地面上滑动,每时每刻,可以选择让钢琴向着地面倾斜的方向滑动一格,或是待在原地不动.当然,钢琴不能滑到障碍上,也不能滑出矩…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 简单的单调队列优化dp.(然而当时却WA得不行.今天总算填了坑) 注意滚动数组赋初值应当继承上一次的该位置的值.还有转移的时候取个max. #include<iostream> #include<cstdio> #include<cstring> using namespace std; ,INF=;// ][N][N],ans,q[N],h,t; char…
题目大意:给定一个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) #incl…
1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 1802  Solved: 1097[Submit][Status][Discuss] Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大的钢琴家一生都漂泊在大海上,他的名字叫丹尼•布德曼•T.D.•柠檬•1900,朋友们都叫他1900…
[BZOJ1499][NOI2005]瑰丽华尔兹 Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大的钢琴家一生都漂泊在大海上,他的名字叫丹尼•布德曼•T.D.•柠檬•1900,朋友们都叫他1900. 1900在20世纪的第一年出生在往返于欧美的邮轮弗吉尼亚号上,很不幸他刚出生就被抛弃了,成了孤儿.1900孤独的成长在弗吉尼亚号上,从未离开过这个摇晃的世界.也许是对他…
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1499 题解: 单调队列优化DP 定义 dp[t][x][y] 表示第t个时间段之后,处在(x,y)位置所滑过的最长距离. 显然 dp[t][x][y] 的来源就是 dp[t-1][x'][y'],表示由(x',y')这个点滑过来的.   所以枚举t,x,y 以及滑行距离(以便得到(x',y')位置)进行DP,复杂度为kN³   然后考虑优化, 对于某个方向的滑行,不需要每次都重新枚举滑行距…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 朴素DP方程很好想,以右移为例,就是 f[i][x][y]=max(f[i][x][y],f[i-1][x][j]+y-j) : 每一行/列会用到一些相同的状态更新,所以可以用单调队列优化. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; ,in…
设f[a][i][j]为第a段时间结束时在(i,j)位置的最长滑行距离,转移很好想,就是分四个方向讨论,然后枚举这段时间的滑行长度取个max即可 但是这样是O(n^4)的,考虑优化 发现同一行或列,取max对应a-1中的是单调挪动的一个区间,所以用单调栈维护当前区间,每次移动的时候要把左端点已经大于最长滑行距离的出队,然后把新点放进去,然后直接更新答案,这样就省去了一个n的时间 注意如果遇到障碍的话,当前的f赋值-inf,然后把队列清空 #include<iostream> #include&…
1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 893  Solved: 508[Submit][Status] Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大的钢琴家一生都漂泊在大海上,他的名字叫丹尼•布德曼•T.D.•柠檬•1900,朋友们都叫他1900. 1900在20世纪…
1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 1714  Solved: 1042[Submit][Status][Discuss] Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大的钢琴家一生都漂泊在大海上,他的名字叫丹尼•布德曼•T.D.•柠檬•1900,朋友们都叫他1900…
题外话:题目极好,做题体验极差 题面:[NOI2005]瑰丽华尔兹 题解: F[t][i][j]表示第t时刻钢琴位于(i,j)时的最大路程F[t][i][j]=max(F[t-1][i][j],F[t-1][a][b]+1) (mp[i][j]可以到达,(a,b)直接到(i,j)之间没有家具,即路径合法)因为船的倾斜是连续的,所以可以考虑按时间段来进行dpF[t][i][j]表示前t个时间段结束后,钢琴位于(i,j)的最大路程F[t][i][j]=max(F[t][i][j],F[t-1][a]…
链接P2254 [NOI2005]瑰丽华尔兹 首先有个很朴素的\(dp\),设\(f_{i,j,k}\)表示\(k\)时刻地点\(i,j\)的最长长度. 然后这样不能优化,考虑利用一段连续时间是同一个方向,设\(f_{k,i,j}\)表示时段\(k\),地点\(i,j\)的最长长度. 那么\[f_{k,i,j}=max(f_{k,i,j},f_{k,i*,j*}+dis)(i*,j*为上一个合理的位置)\] 如果中间有一个不合法位置直接退出(然而这样就过了--) 显然有限制\(dis\leq l…
题解-[NOI2005]瑰丽华尔兹 [NOI2005]瑰丽华尔兹 \(n\times m\) 的矩阵.以 \((x,y)\) 为起点.一共 \(k\) 段时间,每段时间为 \([s_i,t_i](t_i+1=s_{i+1})\),每秒可以向 \(d_i\) 方向运动一个单位(不能超出矩阵,不能走到给出矩阵的障碍物处,\(d=\{1,2,3,4\}\) 分别表示上下左右)或不动,求最后运动最长总距离. 数据范围:\(1\le n,m\le 200\),\(1\le k\le 200\),\(1\l…
题目链接 luogu P2254 [NOI2005]瑰丽华尔兹 题解 为什么我我我不放放放bzoj的链接呢? 因为打的暴力啊,然后bzojT了呀QAQQQQQ(逃 然后luogu竟然过了呀呀呀 dp[i][j][k]表示第k段时间结束时,你在第(i,j)位置的最长距离quqqqq 代码 // luogu-judger-enable-o2 #include<cstdio> #include<cstring> #include<algorithm> const int ma…
Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大的钢琴家一生都漂泊在大海上,他的名字叫丹尼•布德曼•T.D.•柠檬•1900,朋友们都叫他1900. 1900在20世纪的第一年出生在往返于欧美的邮轮弗吉尼亚号上,很不幸他刚出生就被抛弃了,成了孤儿.1900孤独的成长在弗吉尼亚号上,从未离开过这个摇晃的世界.也许是对他命运的补偿,上帝派可爱的小天使艾米丽照顾他.可能是…
题目 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大的钢琴家一生都漂泊在大海上,他的名字叫丹尼•布德曼•T.D.•柠檬•1900,朋友们都叫他1900. 1900在20世纪的第一年出生在往返于欧美的邮轮弗吉尼亚号上,很不幸他刚出生就被抛弃了,成了孤儿.1900孤独的成长在弗吉尼亚号上,从未离开过这个摇晃的世界.也许是对他命运的补偿,上帝派可爱的小天使艾米丽照顾他.可能是天使的点化,190…
Code: #include<cstdio> #include<cstring> #include<deque> #include<algorithm> using namespace std; const int N = 200 + 3; char map[N][N]; int n, m, k, dp[N][N], fin; struct Node{ int x, y, val; Node(int x = 0, int y = 0,int val = 0)…
传送门 单调队列优化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;&quo…
这道题 网上题解还是很多很好的 强烈推荐黄学长 码风真的好看 神犇传送门 学习学习 算是道单调队列优化dp的裸题吧 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ,inf=0x3f3f3f3f; int read(){ ,f=,c=getchar(); ; c=getchar();} +(c-'); c=getchar();} return ans*f; } int…
传送门 题解 大概就是设$dp[i][x][y]$表示在第$i$个时间段,在$(x,y)$时的最大滑动距离 然后转移是$dp[i][x][y]=max(dp[i-1][x][y],dp[i][x'][y']+dis(x,y,x',y'))$ 然后用单调队列进行优化,遇到障碍清除整个单调队列 //minamoto #include<cstdio> #include<cstring> ; template<:;} int n,m,sx,sy,k,ans,dp[N][N]; ,-,…
题目描述 不妨认为舞厅是一个N行M列的矩阵,矩阵中的某些方格上堆放了一些家具,其他的则是空地.钢琴可以在空地上滑动,但不能撞上家具或滑出舞厅,否则会损坏钢琴和家具,引来难缠的船长.每个时刻,钢琴都会随着船体倾斜的方向向相邻的方格滑动一格,相邻的方格可以是向东.向西.向南或向北的.而艾米丽可以选择施魔法或不施魔法:如果不施魔法,则钢琴会滑动:如果施魔法,则钢琴会原地不动. 艾米丽是个天使,她知道每段时间的船体的倾斜情况.她想使钢琴在舞厅里滑行的路程尽量长,这样1900 会非常高兴,同时也有利于治疗…
http://www.lydsy.com/JudgeOnline/problem.php?id=1499 (题目链接) 题意 给出一个n*m的地图,刚开始人在(x,y),每次给出一段区间(l,r,t),表示在时间[l,r]内,可以使人向4个方向(t)移动一格.求最大可以移动多少格. Solution 考虑每一列(上下移)或者一行(左右移)的情况.以右移为例,我们可以很快列出dp方程:f[i][x][y]=max(f[i][x][y],f[i-1][x][j]+y-j).这个dp方程我们可以用单调…
http://www.lydsy.com/JudgeOnline/problem.php?id=1499 舞厅是一个N行M列的矩阵,矩阵中的某些方格上堆放了一些家具,其他的则是空地.钢琴可以在空地上滑动,但不能撞上家具或滑出舞厅,否则会损坏钢琴和家具,引来难缠的船长.每个时刻,钢琴都会随着船体倾斜的方向向相邻的方格滑动一格,相邻的方格可以是向东.向西.向南或向北的.而艾米丽可以选择施魔法或不施魔法:如果不施魔法,则钢琴会滑动:如果施魔法,则钢琴会原地不动. 艾米丽是个天使,她知道每段时间的船体的…
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1047 题意:给出一个n*m的矩阵.在所有K*K的子矩阵中,最大最小差值最小的是多少? 思路:枚举每一行,枚举每一列,(r,c),将(r-K+1,c-K+1)中的数字插入到单调队列中保存(这里设置两个单调队列,一个最大一个最小).每次计算以(r,c)为右下角的子矩阵的值时,判断队列头元素的列数是不是大于等于c-K+1,否则删掉队头.插入时,比如维护最小的单调队列,要判断队尾的元素是不是小…
dp. 首先我们可以看到每个时间段只能往一个方向转移最多t步(t为时间段的长度),所以我们可以按时间段dp.因为这个前后值互不影响,也不用占用这一维空间就可以省去. 然后每个时间段内是一列一列(行) 进行递推. 如果朴素枚举是O(n^2)时间无法承受.所以每列(行)用一个单调队列维护dp,队首放着移动距离最大可以到达的点,这样复杂度就降到了O(n).每次要递推n列(行).所以总复杂度为O(k*n^2). #include<cstdio> #include<algorithm> #i…
/*先贴个n*n的*/ #include<iostream> #include<cstdio> #include<cstring> #define maxn 1000010 using namespace std; int n,k,h[maxn],f[maxn],Q; int main() { scanf("%d",&n); ;i<=n;i++) scanf("%d",&h[i]); scanf("…
嘟嘟嘟 这题大家应该都做过,就是暴力dp+单调队列优化. dp方程其实很好想,最初是这样的:dp[t][i][j]表示时刻\(t\)后,走到\((i, j)\)格子的最远路程,于是就有: \[dp[t][i][j] = max\{ dp[t - 1][px][py] \} + 1\] 但这是\(O(Tn ^ 2)\)的,不仅会TLE,还能MLE. 接着看题,发现给得\(K\)没用上.想一下发现\(K\)的特点是同一时间区间的移动方向是一样的,于是我们把第一维改成第\(k\)个时间区间,转移方程就…
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 4750  Solved: 2145[Submit][Status][Discuss] Description 现 在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度. 2. 插入操作.语法:A n 功能:将n加上t,其中t是最近一…
非常无脑和码农的单调队列优化\(dp\) 我们发现一个时间段内移动的情况是一样的,而时间段的数目又非常少,所以可以直接按照时间段来进行\(dp\) 由于每一次\(dp\)的移动距离都是小于等于某一个固定值的,于是可以直接上单调队列优化 复杂度\(O(nmk)\) 代码 #include<iostream> #include<cstring> #include<cstdio> #define re register #define maxn 205 #define max…
题目实际上是求环套树森林中每个环套树的直径. 对于环套树的直径,可以先找到这个环套树上面的环.然后把环上的每一点都到达的外向树上的最远距离作为这个点的权值. 那么直径一定就是从环上的某个点开始,某个点结束的. 把环拆成链,定义dp[i]表示第i个点为结束点的最远距离,显然有dp[i]=val[j]+sum[i]-sum[j-1]+val[i].显然可以用单调队列优化这个DP. 剩下的就是这样依次统计每个环套树的直径之和. 对于环套树上找环可以借鉴最小树形图找环的技巧. 首先将边定向,保证每个点的…