Xuanxuan has n sticks of different length. One day, she puts all her sticks in a line, represented by S1, S2, S3, ...Sn. After measuring the length of each stick Sk (1 <= k <= n), she finds that for some sticks Si and Sj (1<= i < j <= n), each stick placed between Si and Sj is longer than Si but shorter than Sj.

Now given the length of S1, S2, S3, …Sn, you are required to find the maximum value j - i.

Input

The input contains multiple test cases. Each case contains two lines.
Line 1: a single integer n (n <= 50000), indicating the number of sticks.
Line 2: n different positive integers (not larger than 100000), indicating the length of each stick in order.

Output

Output the maximum value j - i in a single line. If there is no such i and j, just output -1.

Sample Input

  1. 4
  2. 5 4 3 6
  3. 4
  4. 6 5 4 3

Sample Output

  1. 1
  2. -1
  3.  
  4. 思路:求每个点往右的最大值且都不小于他,先想到了单调队列,区间最值就用ST表,整了整发现WA了,发现并不需要两端队列,遍历每一个点找右侧就行了,好像叫单调栈,找到比每个点小的第一个点,在这个区间内找最大点,用二分加速寻找就行了
  1. const int maxm = 5e4+;
  2.  
  3. int Max[maxm][], Min[maxm][], a[maxm], N;
  4.  
  5. void init() {
  6. memset(Max, , sizeof(Max)), memset(Min, , sizeof(Min));
  7. }
  8.  
  9. int BisearchMin(int pos) {
  10. int l = pos+, r = N, mid, ans = N, k, t;
  11. while(l <= r) {
  12. mid = (l + r) >> ;
  13. k = log((double)(mid-pos+)) / log(2.0);
  14. t = min(Min[pos][k], Min[mid - ( << k) + ][k]);
  15. if(t < a[pos]) {
  16. ans = mid;
  17. r = mid - ;
  18. } else
  19. l = mid + ;
  20. }
  21. return ans;
  22. }
  23.  
  24. int BisearchMax(int l, int r) {
  25. int k, ans, mid, t, t2;
  26. k = log((double)(r - l + )) / log(2.0);
  27. t = max(Max[l][k], Max[r - (<<k)+][k]);
  28. while(l <= r) {
  29. mid = (l + r) >> ;
  30. k = log((double)(mid - l + )) / log(2.0);
  31. t2 = max(Max[l][k], Max[mid - (<<k)+][k]);
  32. if(t2 == t) {
  33. ans = mid;
  34. r = mid - ;
  35. } else
  36. l = mid + ;
  37. }
  38. return ans;
  39. }
  40.  
  41. int main() {
  42. while(scanf("%d", &N) != EOF) {
  43. init();
  44. int ans = -;
  45. for(int i = ; i <= N; ++i) {
  46. scanf("%d", &a[i]);
  47. Max[i][] = Min[i][] = a[i];
  48. }
  49. for(int k = ; (<<k) <= N; ++k) {
  50. for(int i = ; i+(<<k)- <= N; ++i) {
  51. Max[i][k] = max(Max[i][k-], Max[i+(<<(k-))][k-]);
  52. Min[i][k] = min(Min[i][k-], Min[i+(<<(k-))][k-]);
  53. }
  54. }
  55. for(int i = ; i <= N; ++i) {
  56. int r = BisearchMin(i);
  57. r = BisearchMax(i, r);
  58. if(i != r)
  59. ans = max(ans, r - i);
  60. }
  61. printf("%d\n", ans);
  62. }
  63. return ;
  64. }
  1.  

Day6 - I - Sticks Problem POJ - 2452的更多相关文章

  1. POJ 2452 Sticks Problem

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

  2. poj 2452(RMQ+二分查找)

    题目链接: http://poj.org/problem?id=2452 题意:在区间[1,n]上找到满足 a[i]<a[k]<a[j] (i<=k<=j) 的最大子区间 (j ...

  3. Sticks Problem

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

  4. A - Jessica's Reading Problem POJ - 3320 尺取

    A - Jessica's Reading Problem POJ - 3320 Jessica's a very lovely girl wooed by lots of boys. Recentl ...

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

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

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

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

  7. Jessica's Reading Problem POJ - 3320

    Jessica's Reading Problem Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17562   Accep ...

  8. Greedy:Jessica's Reading Problem(POJ 3320)

    Jessica's Reading Problem 题目大意:Jessica期末考试临时抱佛脚想读一本书把知识点掌握,但是知识点很多,而且很多都是重复的,她想读最少的连续的页数把知识点全部掌握(知识点 ...

  9. POJ-2452 Sticks Problem 二分+RMQ

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

随机推荐

  1. Pentaho6.1中D3可视化库的集成及数据联动的实现

    1.软件环境 操作系统版本:Win 10 64位 可视化图形库:D3 Pentaho版本: biserver-ce-6.1.0.1-196 2.对D3的简单介绍 D3允许你将任意的数据绑定到文档对象模 ...

  2. 为小学生出四则运算题目.java

    import java.util.Scanner; import java.util.Random; public class test{ public static int s1 = new Ran ...

  3. 算法-leetcode-65-Valid Number

    算法-leetcode-65-Valid Number 上代码: # coding:utf-8 __author__ = "sn" """Valida ...

  4. 算法复杂度图示&JavaScript算法链接

    https://juejin.im/post/5c9a1d58e51d4559bb5c6694

  5. 什么是Socket:

    先了解一些前提: 网络由下往上分为 物理层 .数据链路层 . 网络层 . 传输层 . 会话层 . 表现层 和 应用层.通过初步了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对 ...

  6. 【转载】Cmd Markdown 公式指导手册

    目录 Cmd Markdown 公式指导手册 一.公式使用参考 1.如何插入公式 2.如何输入上下标 3.如何输入括号和分隔符 4.如何输入分数 5.如何输入开方 6.如何输入省略号 7.如何输入矢量 ...

  7. Spring Schedule 实现定时任务

    很多时候我们都需要为系统建立一个定时任务来帮我们做一些事情,SpringBoot 已经帮我们实现好了一个,我们只需要直接使用即可,当然你也可以不用 SpringBoot 自带的定时任务,整合 Quar ...

  8. 118、Java中String类之取字符串长度

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  9. python的沙盒环境--virtualenv

      VirtualEnv用于在一台机器上创建多个独立的python运行环境,VirtualEnvWrapper为前者提供了一些便利的命令行上的封装. 使用 VirtualEnv 的理由: 隔离项目之间 ...

  10. Python 中的else

    在其他程序语言中,else 似乎只是与 if 关键字有缘分.而与其他的关键字没有联系,不能搭配使用,而在python中,else 除了与 if 匹配外, 还可以与for.while/ try等关键字匹 ...