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

UVA - 1619 Feel Good(扫描法)

时间:2019-02-05 16:57:05      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:for   ++   alt   png   typedef   style   info   sum   技巧   

题目:

技术图片

 

思路:

预处理出a[i]在哪个范围区间内是最小的,然后直接遍历a数组求答案就可以了。

这个预处理的技巧巧妙的用了之前的处理结果。(大佬tql)

代码:

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define MAX 1e3
#define FRE() freopen("in.txt","r",stdin)
#define FRO() freopen("out.txt","w",stdout)
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int maxn = 1000100;
int r[maxn],l[maxn];
ll sum[maxn],a[maxn];
int n;

int main(){
    FRE();
    int kase = 0;
    while(scanf("%d",&n)!=EOF){
        sum[0] = 0;
        a[0] = a[n+1] = -1;
        for(int i=1; i<=n; i++){
            scanf("%lld",&a[i]);
            sum[i] = sum[i-1]+a[i];
            l[i] = r[i] = i;
        }

        for(int i=1; i<=n; i++){//根据已经得到的范围快速求出当前的最小值范围
            while(a[i] <= a[l[i]-1]){
                l[i] = l[l[i]-1];
            }
        }

        for(int i=n; i>=1; i--){
            while(a[i] <= a[r[i]+1]){
                r[i] = r[r[i]+1];
            }
        }

        int L=1,R=1;//当不知道具体的边界的时候,就将边界设为开头
        ll ans = a[1]*a[1];
        for(int i=1; i<=n; i++){
            ll tsum = sum[r[i]] - sum[l[i]-1];
            if(ans < tsum * a[i]){
                L = l[i];
                R = r[i];
                ans = tsum*a[i];
            }
        }
        if(kase++){
            printf("\n");
        }
        printf("%lld\n",ans);
        printf("%d %d\n",L,R);
    }
    return 0;
}

 

UVA - 1619 Feel Good(扫描法)

标签:for   ++   alt   png   typedef   style   info   sum   技巧   

原文地址:https://www.cnblogs.com/sykline/p/10352836.html

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