设为首页 加入收藏

TOP

POJ 2452 (RMQ + 二分)
2015-11-21 00:56:10 来源: 作者: 【 】 浏览:1
Tags:POJ 2452 RMQ +二分
Sticks Problem
Time Limit: 6000MS ? Memory Limit: 65536K
Total Submissions: 10141 ? Accepted: 2682

Description

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

4
5 4 3 6
4
6 5 4 3

Sample Output

1
-1


题意: 给一个长度为n的序列 其中 Si ~ Sj (1<= i < j <= n)为其子序列 问:满足Si ~ Sj 中任意一个数大于Si 且 小于Sj的序列中,j - i的值最大为多少。
解题思路: 一开始就没想过暴力,但是其实暴力是可以过的,坑。。。。。
然而我的方法是用RMQ处理出区间最值,然后暴力扫过去,对每一个数 用两次二分找出 这个数所能形成的最大区间。 (先假设起点为i)两次二分作用分别为:
第一次:找出i能作为最小值的最大区间位置(其实这个可以用单调栈来处理) 第二次:在第一次找出的区间内寻找出该区间最大值的位置
#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include
          #include 
          
            #include 
           
             #include 
            
              #include 
             
               #define PI acos(-1.0) #define eps 1e-8 const int inf = (1<<30) - 10; using namespace std; const int maxx = 50000 + 10; int n; int a[maxx]; int dpmax[maxx][20]; int dpmin[maxx][20]; int mn[maxx]; inline void init_rmq(int a[],int n){ ///构建rmq mn[0]=-1; for(int i = 1;i <= n; ++i){ if((i&(i-1))==0){ mn[i] = mn[i-1]+1; }else{ mn[i] = mn[i-1]; } dpmax[i][0] = a[i]; dpmin[i][0] = a[i]; } for(int j = 1;j <= mn[n]; ++j){ for(int i = 1;i+(1<
              
               >1; if(min_rmq(i,mid) == a[i]){ l = mid; }else{ r = mid; } } int ll = i; int rr = l; if(l != i){ int temp = max_rmq(ll,rr); while(ll+1 != rr){ int mid = (ll+rr)>>1; if(max_rmq(i,mid) < temp){ ll = mid; }else{ rr = mid; } } } if(rr-i>ans) ans = rr-i; } if(ans) printf(%d ,ans); else printf(-1 ); } return 0; } /** 7 1 2 3 7 4 5 6 */ 
              
             
            
           
          
        
       
      
     
    
   
  
?
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hdu 1283 最简单的计算机 下一篇HDU-1542-Atlantis-线段树+面积并..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: