Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

单调队列+线段树

Posted by Panamera at 2013-10-10 08:43:58
#include<stdio.h>
#include<iostream>
#define MAX_N 50009
using namespace std;
int q[MAX_N];
struct Tree
{
    int left,right,maxSub;
}tree[4*MAX_N];
int a[MAX_N];
void build(int id,int l,int r)
{
    tree[id].left=l,tree[id].right=r;
    if(l==r)
    {
        tree[id].maxSub = l ;
        return ;
    }
    int mid = (l+r)>>1;
    build(id*2,l,mid);
    build(id*2+1,mid+1,r);
    tree[id].maxSub = a[tree[id*2].maxSub] < a[tree[id*2+1].maxSub] ? tree[id*2+1].maxSub : tree[id*2].maxSub ;
}
int query(int id,int l,int r)
{
    if(tree[id].left==l&&tree[id].right==r)
        return tree[id].maxSub;
    int mid = (tree[id].left+tree[id].right)>>1;
    if(r<=mid)
        return query(id*2,l,r);
    else if(l>mid)
        return query(id*2+1,l,r);
    int s1 = query(id*2,l,mid), s2 = query(id*2+1,mid+1,r);
    return a[s1] < a[s2] ? s2 : s1 ;
}
int main()
{
    int n ;
    while(~scanf("%d",&n))
    {
        int res = 0 ,top = 0 ,temp;
        for(int i=1;i<=n;++i)
            scanf("%d",a+i);
        build(1,1,n);
        for(int i=1;i<=n;++i)
        {
            if(!top || a[q[top-1]] < a[i])
                q[top++] = i ;
            else
            {
                while(top && a[q[top-1]] > a[i])
                {
                    --top;
                    temp = query(1,q[top],i-1);
                    res = max(res,temp-q[top]);
                }
                q[top++] = i ;
            }
        }
        while(top)
        {
            --top;
            temp = query(1,q[top],n);
            res = max(res,temp-q[top]);
        }
        printf("%d\n",res ? res : -1);
    }
    return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator