码迷,mamicode.com
首页 > 其他好文 > 详细

uva1619 Feel Good

时间:2018-10-06 16:43:08      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:最小   div   printf   scan   else   long   const   return   using   

单调队列,滑动窗口

int t=0;
while(scanf("%d",&n)==1){
if(t)
printf("\n"); //有点方便

单调队列用deque很方便
for(int i=1;i<=n;i++){ 维护单调队列
while(!q.empty()&&a[i]<=a[q.back()]){
R[q.back()]=i-1;
q.pop_back();
}
if(q.empty())L[i]=1;
else L[i]=q.back()+1;
q.push_back(i);
}
while(!q.empty()){
R[q.back()]=n;
q.pop_back();
}

 

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
typedef long long LL;
using namespace std;
const int maxn=100010;
int n;
int a[maxn],L[maxn],R[maxn];//l[i]表示以a[i]为最小值的左半区间的最左边端点,r[i]表示以a[i]为最小值的右半区间的最右边端点
LL sum[maxn];

int main(){
    int t=0;
    while(scanf("%d",&n)==1){
        if(t)
            printf("\n");
        t++;
        sum[0]=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            sum[i]=sum[i-1]+a[i];
        }
      deque<int>q;
      for(int i=1;i<=n;i++){
        while(!q.empty()&&a[i]<=a[q.back()]){
            R[q.back()]=i-1;
            q.pop_back();
        }
        if(q.empty())L[i]=1;
        else L[i]=q.back()+1;
        q.push_back(i);
      }
      while(!q.empty()){
        R[q.back()]=n;
        q.pop_back();
      }
      LL ans=0;
      int ansL=1,ansR=1;
      for(int i=1;i<=n;i++){
        if(ans<(sum[R[i]]-sum[L[i]-1])*a[i]){
            ans=(sum[R[i]]-sum[L[i]-1])*a[i];
            ansL=L[i],ansR=R[i];
        }
      }
      printf("%lld\n",ans);
      printf("%d %d\n",ansL,ansR);
    }
return 0;
}

 

uva1619 Feel Good

标签:最小   div   printf   scan   else   long   const   return   using   

原文地址:https://www.cnblogs.com/lqerio/p/9747372.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!