Sticks Problem--(单调队列)

来源:互联网 发布:泉州用友软件 编辑:程序博客网 时间:2024/05/16 04:40

Sticks Problem

Time Limit : 12000/6000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 64   Accepted Submission(s) : 19
Problem 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. <br>Line 1: a single integer n (n <= 50000), indicating the number of sticks. <br>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
45 4 3 646 5 4 3
 

Sample Output
1-1

i和j之间数k(i<k<=j)满足2个条件:1.a[i]<a[k], 2.a[k]<=a[j];  ,很搞笑对吗,后面这两个条件是分别证的

代码:

#include<iostream>#include<string>#include<cstdio>#include<algorithm>#include<cmath>#include<iomanip>#include<queue>#include<cstring>#include<map>using namespace std;typedef long long int ll;int n;int a[50005],q[50005],r[50005];int main(){    int i,j;    while(scanf("%d",&n)!=EOF)    {        for(i=1;i<=n;i++)            scanf("%d",&a[i]);        int tail=1; q[1]=n+1;        for(i=n;i>=1;i--)  //用单调队列求出a[i]右边连续大于他的数有几个        {            while(tail>=1&&a[q[tail]]>a[i]) tail--;            r[i]=q[tail]-1-i;            q[++tail]=i;        }        int maxn,temp,ans=0;        for(i=1;i<=n;i+=temp+1)        {            maxn=temp=-1;            for(j=0;j<=r[i];j++) //对于大于他的这些数,都是满足条件1的            {                if(a[i+j]>maxn) //只要a[i+j]大于maxn,说明他是目前最大的也就是以他结尾的话前面a[i+1]至a[i+j]都满足条件2                {                    maxn=a[i+j];                    temp=j;  //此时记录下j,下面i+=temp+1;就从那些没算到的开始                }            }            if(ans<temp) ans=temp;        }        if(ans!=0) printf("%d\n",ans);        else printf("-1\n");    }    return 0;}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 门破了个洞怎么办 钢圈轮毂刮花了怎么办 瓷砖用刀子划了怎么办 陶瓷洗手台裂了怎么办 洗车泵水管坏了怎么办 印胶浆里面渗入了发泡浆怎么办? 管子断在水管里怎么办 衣服上的织带缩水怎么办 真丝衣服拔缝了怎么办 顾客说衣服太花怎么办 铝和碱反应变黑怎么办 40度高温多肉怎么办 沾到医用蓝药水怎么办? 裤子弄上泡沫胶怎么办 苍蝇纸粘衣服上怎么办 苍蝇胶沾衣服上怎么办 灯带为什么不亮怎么办 苹果6比屏幕变黄怎么办 雷腾键盘锁了怎么办 自吸泵电机不转怎么办 孕38周胎儿偏小怎么办 被火烧黑的铁怎么办 锅被烟熏黑了怎么办 墙壁被烟熏黑了怎么办 壁纸被烟熏黑了怎么办 空调被烟熏黑了怎么办 牙被烟熏黑了怎么办 尖头鞋把尖折了怎么办 腰椎固定手术钢钉断了怎么办 脚被钢钉扎了怎么办 皮帘子有胶了怎么办 12v插口没有电怎么办 吃了一颗聚乙烯醇怎么办 立式注塑机产品粘膜怎么办 被小松鼠咬了怎么办 被宠物松鼠咬了怎么办 手被松鼠咬出血怎么办 银联认证码失败怎么办 国际汇款触发合规查询怎么办 外面的网线断了怎么办 网线被别的车挂断了怎么办