YY_More

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

2011年6月22日

摘要: 这道题很有意思,需要巧妙地套用单调队列首先我们要明确几件事情1.假设我们现在知道序列(i,j)是符合标准的,那么如果第j+1个元素不比(i,j)最大值大也不比最小值小,那么(i,j+1)也是合法的2.如果(i,j)不合法的原因是差值比要求小,那在(i,j)范围内的改动是无效的,需要加入j+1元素充当最大值或者最小值才可能获得合法的序列3.假设序列(i,j)的差值比要求大,那么我们必须将其中的最大值或者最小值从序列中删除出去,才可能获得一个合法的序列,只往里加入元素是不可能令序列合法的基于以上几点考虑,我们可以利用单调队列完成我们的算法。设定一个变量ST作为当前合法序列的开端(对于一个序列(i, 阅读全文
posted @ 2011-06-22 20:16 YY_More 阅读(340) 评论(0) 推荐(1) 编辑

摘要: 也是单调队列的基本题,首先要把N的环拆成2N的链,设f[i]是以第i个元素结尾的序列的最大和,f[i]=max(sum[j+1,i])=max(sum[1,i]-sum[1,j])=sum[1,i]-min(sum[1,j])(i-j<=K),这样就可以用单调队列维护了//By YY_More#include<cstdio>#include<cstring>int D[200010],sum[200010],L,R,T,n,k,p,q,max;int main(){ scanf("%d",&T); while (T-->0){ s 阅读全文
posted @ 2011-06-22 19:50 YY_More 阅读(221) 评论(0) 推荐(1) 编辑

摘要: 这道是NOI2005的原题吧这道题乍一看,很容易设计出状态f[T][N][M],而且鉴于T有40000,K只有200,倾斜方向也是基于K的,因此把状态设计成f[K][N][M],即第K段时间滑到(N,M)位置的最大滑行距离。设p[K]为第K段时间的持续长度,这样的话,根据倾斜方向不同,我们得到了四种转移方程。f[K][N][M]=max(f[K-1][i][j]+dist)(dist<=p[K])向上时:j=M,i>=N,dist=i-N向下时:j=M,i<=N,dist=N-i向左时:i=N,j>=M,dist=j-M向右时:i=N,j<=M,dist=M-j可 阅读全文
posted @ 2011-06-22 15:56 YY_More 阅读(523) 评论(0) 推荐(1) 编辑

摘要: 这是一道最最基础的使用双端队列优化的题目。题目的意思就是求出指定长度子序列的最大值和最小值。如果说硬要弄一个方程的话,那就是f[i]=max/min(a[j]) (f[i]指以i结尾的子序列,a[j]指原序列中第k个元素。i-k+1<=j<=i)显然我们可以通过单调队列来维护最大值和最小值,复杂度O(n)按理说双端队列应该有两个域,一个存下标,一个存关键值,但是这道题中关键值很容易从原序列中取出,所以就省掉了这个域,在这里提醒一下刚接触单调队列的人。当然,这个数据范围暴力RMQ也可以过,其实也不是很暴力啦,但是跟O(n)的算法比就不太优美了。提示:在POJ上做这道题的时候,如果你超 阅读全文
posted @ 2011-06-22 14:45 YY_More 阅读(1010) 评论(0) 推荐(0) 编辑