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. Android常见漏洞

    Android常见漏洞 漏洞名称: Log敏感信息泄露 漏洞描述: 程序运行期间打印了用户的敏感信息,造成泄露 修改建议: 建议禁止隐私信息的log 漏洞名称: web https校验错误忽略漏洞 漏 ...

  2. Java中过滤出字母、数字和中文的正则表达式

    1.Java中过滤出字母.数字和中文的正则表达式 (1)过滤出字母的正则表达式 [^(A-Za-z)] (2)过滤出数字的正则表达式 [^(0-9)] (3)过滤出中文的正则表达式 [^(\\u4e0 ...

  3. freemarker自定义标签报错(四)

    freemarker自定义标签 1.错误描述 六月 05, 2014 11:31:35 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严 ...

  4. RHEL64 缺少ISO 9660图像 安装程序试图挂载映像#1,在硬盘上无法找到该映像

    用光盘安装Linux,很容易,按照提示一步一步就好.如果没有光驱,只好想办法用硬盘或者U盘安装了. 首先说说怎样用U盘启动Linux的安装程序:1.将ISO镜像文件拷贝到U盘中,并解压到U盘根目录.将 ...

  5. 从DataTable中查询数据

    /// <summary> /// 从DataTable中查询数据 /// </summary> /// <param name="tb">待处 ...

  6. Django学习-18-中间件

    为了验证中间件功能和函数执行过程,手动注册3个中间件到setting.py文件中 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddlewa ...

  7. ajax交互数据简单拼装,数组成字符串

    json2Form:function(json) { var str = ""; for(var p in json){ // 判断对象是否为数组 if(typeof json[p ...

  8. 一个2D平面游戏,的碰撞引擎实现

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); i ...

  9. 洛谷P3434 [POI2006]KRA-The Disks(线段树)

    洛谷题目传送门 \(O(n)\)的正解算法对我这个小蒟蒻真的还有点思维难度.洛谷题解里都讲得很好. 考试的时候一看到300000就直接去想各种带log的做法了,反正不怕T...... 我永远只会有最直 ...

  10. [HNOI2007]紧急疏散

    二分+网络流判定 首先处理出每个人和门间的距离 二分时间,连边时把每个门拆成mid个,一个人能在mid时间内到达,他也可以在这等一会儿,那么这mid个门之间连边 如果可以在x的时间内到达,那么x~mi ...