Sticks Problem poj-2452

    题目大意:给你一串n个数的数列a,上面的数为a1到an。我们求最大的y-x,其中,y和x满足1.x<y 2.任意的x<i<y,都有ai>ax&&ai<ay。

    注释:n<=50000,ai<=100000

      想法:我们很容易就想到,松弛x。那么,对于任意的x,y都必须满足这样的条件,就是说y和x之间的所有数,都大于ax。那么,我们就可以处理出任意的x右边的第一个比ax小的数的下标为r[x]。这样,我们就可以显然第知道,y必定存在于x到r[x]之间。那么,什么样的y是最大的且满足题意的呢?不难想到,就是x到r[x]之间的最大值的下标,就是y。这样,我们思考怎样才能实现这个过程?首先,我们需要求出r[x],这是n*n的,我们想优化吧,用单调队列优化,时间复杂度O(nlogn)。然后,我们对于任意的x都有一个唯一的r[x]与之对应,我们想在这段区间内求出这段区间之内的最大值,用ST求RMQ下标即可。

    最后,附上丑陋的代码... ...

 #include <iostream>
#include <cstdio>
#define N 50100
using namespace std;
int r[N],f[N][],a[N],log[N];
int main()
{
int n;
for(int i=;i<=N;i++) log[i]=log[i>>]+;//我们可以直接处理ST中的log数组
while(~scanf("%d",&n))
{
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=n+;i>=;i--)//单调队列优化,那个(n+1)是极其重要的!!
{
if(a[i]>a[i+]) r[i]=i+;
else
{
int t=r[i+];
while(a[i]<a[t]) t=r[t];
r[i]=t;
}
}
r[n+]=-;
// for(int i=2;i<=n;i++) log[i]=log[i>>1]+1;
for(int i=;i<=n+;i++)//预处理的初始化是下标
{
f[i][]=i;
}
for(int i=;(<<i)<=n+;i++)
{
for(int j=;j+(<<i)-<=n+;j++)
{
if(a[f[j][i-]]>a[f[j+(<<(i-))][i-]])//由于我们维护的是下标,所以就比较的麻烦。
f[j][i]=f[j][i-];//其实我开始写的是三目运算符,但是太长了,就写if了。
else f[j][i]=f[j+(<<(i-))][i-];
}
}
int maxn=-;
int len=;
int maxx;
for(int i=;i<=n;i++)
{
len=log[r[i]-i+];
if(a[f[i][len]]>a[f[r[i]-(<<len)+][len]]) maxx=f[i][len];
else maxx=f[r[i]-(<<len)+][len];//同样,我们在查询时需要注意,我们维护的是下标。
maxn=max(maxn,maxx-i);
}
if(maxn<=) printf("-1\n");//这里,我们说明:因为y>x,所以maxn==0的情况也是不满足题意的。
else printf("%d\n",maxn);
}
}

    小结:RMQ是可以维护下标的,只是实现过程有些磨人....

      1.我们需要明确注意,单调队列优化的时候,r[n+1]是坚决不能是0的??!

      2.单调队列处理下标时,不可对a赋值...这种错误只有我会犯了吧。

      3.RMQ中ST的思想的重要性远远大于其代码本身。

Sticks Problem的更多相关文章

  1. POJ 2452 Sticks Problem

    RMQ+二分....枚举 i  ,找比 i 小的第一个元素,再找之间的第一个最大元素.....                   Sticks Problem Time Limit: 6000MS ...

  2. POJ_2452 Sticks Problem 【ST表 + 二分】

    一.题目 Sticks Problem 二.分析 对于$i$和$j$,并没有很好的方法能同时将他们两找到最优值,所以考虑固定左端点$i$. 固定左端点后,根据题意,$a[i]$是最小值,那么现在的问题 ...

  3. POJ-2452 Sticks Problem 二分+RMQ

    题目链接: https://cn.vjudge.net/problem/POJ-2452 题目大意: 给出一个数组a,求最大的j-i满足 i<j && a[i] ... a[j] ...

  4. Day6 - I - Sticks Problem POJ - 2452

    Xuanxuan has n sticks of different length. One day, she puts all her sticks in a line, represented b ...

  5. POJ 2452 Sticks Problem (暴力或者rmq+二分)

    题意:给你一组数a[n],求满足a[i] < a[k] < a[j] (i <= k <= j)的最大的 j - i . 析:在比赛时,我是暴力做的,虽然错了好多次,后来说理解 ...

  6. 搜索 + 剪枝 --- POJ 1101 : Sticks

    Sticks Problem's Link:   http://poj.org/problem?id=1011 Mean: http://poj.org/problem?id=1011&lan ...

  7. Hdu1051 Wooden Sticks 2017-03-11 23:30 62人阅读 评论(0) 收藏

    Wooden Sticks Problem Description There is a pile of n wooden sticks. The length and weight of each ...

  8. 容斥 + 组合数学 ---Codeforces Round #317 A. Lengthening Sticks

    Lengthening Sticks Problem's Link: http://codeforces.com/contest/571/problem/A Mean: 给出a,b,c,l,要求a+x ...

  9. hdu 1145(Sticks) DFS剪枝

    Sticks Problem Description George took sticks of the same length and cut them randomly until all par ...

随机推荐

  1. JavaScript获取地址栏中的参数

    JavaScript获取地址栏中的参数 1.获取地址栏中的参数 (1)若地址栏中的地址是: http://10.124.36.56:8080/CMOD/index.jsp?name=you&p ...

  2. HTML5可以省略结束标记的元素

    HTML5可以省略结束标记的元素 1.dd 2.dt 3.li 4.p 5.optgroup 6.option 7.rt 8.rp 9.thread 10.tfoot 11.tr 12.td 13.t ...

  3. java.lang.Exception: Socket bind failed

    1.错误描述 严重: Failed to initialize end point associated with ProtocolHandler ["http-apr-8080" ...

  4. tcp_wrapper

    介绍 对基于tcp协议开发并提供服务的应用程序,所提供的一层访问控制工具 基于库调用实现其功能 * 库名:libwrap 判断服务是否能够由tcp_wrapper进行访问控制 1. 动态编译 ldd命 ...

  5. Django学习-4-request获取数据

    app下views.py             获取前端HTML数据的一些方法             def func(request):                 # request.me ...

  6. python之文件读写详解

    打开文件 函数open() 参数说明: file:文件路径 mode: 文件的读写方式,默认'r',只读方式: buffering:设置缓冲策略,0用于二进制文件,1为行缓冲,用于文本模式:默认二进制 ...

  7. 编写第一个Flutter App(翻译)

    博客搬迁至http://blog.wangjiegulu.com RSS订阅:http://blog.wangjiegulu.com/feed.xml 以下代码 Github 地址:https://g ...

  8. 【BZOJ3531】旅行(树链剖分,线段树)

    [BZOJ3531]旅行(树链剖分,线段树) 题面 Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教 ...

  9. [Luogu3425][POI2005]KOS-Dicing

    题面戳这 题目描述 Dicing is a two-player game and its outcome is fully random. Lately its popularity increas ...

  10. angularJs $mdDialog和$uibModal弹框关闭传值

    $mdDialog以一个点击button按钮出现弹框为例: $scope.btn=function($event,row){ var dScope = $scope.$new(true); dScop ...