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. freemarker之list

    freemarker之list 1.设置数据源 /** * * @Title:student * @Description: * @param:@param name * @return: void ...

  2. Java中的字符串拼接

    Java中的字符串拼接 1.设计源码 /** * @Title:IndexOf.java * @Package:com.you.freemarker.model * @Description: * @ ...

  3. Caused by: Unable to locate parent package [json-default] for [class com.you.user.action.StudentActi

    1.错误描述 信息: Choosing bean (struts) for (com.opensymphony.xwork2.util.TextParser) 2014-7-13 1:52:04 or ...

  4. Linux中挂载Windows共享出来的目录

    Windows中1.新建文件夹,创建共享目录 右键文件夹,共享 2.设置访问方式 Everyone,添加确认 Linux-ubuntu中1.安装cifs#sudo apt-get install ci ...

  5. ListView 无 DataSource 依然用 DataPager 翻页

    ListView 有 DataSource 使用 DataPager 翻页ListView 无 DataSource 使用 DataPager 翻页问题描述点击两次才能翻页返回上一页,内容为空解决方法 ...

  6. Oracle11g客户端client的下载与安装

    下载地址: http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win64soft-09446 ...

  7. 【CF932G】Palindrome Partition(回文树,动态规划)

    [CF932G]Palindrome Partition(回文树,动态规划) 题面 CF 翻译: 给定一个串,把串分为偶数段 假设分为了\(s1,s2,s3....sk\) 求,满足\(s_1=s_k ...

  8. 【Luogu1345】奶牛的电信(网络流)

    [Luogu1345]奶牛的电信(网络流) 题面 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成 ...

  9. [HDU5765]Bonds

    题面 题意 给出一张\(n\)点\(m\)边无向连通图,求每条边出现在多少个割集中. \(n\le20,m\le\frac{n(n-1)}{2}\) sol 所谓割集,就是指把\(n\)个点分成两个集 ...

  10. FFT/NTT 总结

    本总结主要用于帮助个人理解,讲得不足之处,还请各位看官谅解 FFT 补充知识 \(n\)次单位复根(\(w_n\)): 使得\(z^n=1\)的一类复数,这些复数一共有\(n\)个,它们都分布在复平面 ...