ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

UVA - 1619 Feel Good(扫描法)

2019-02-05 16:38:08  阅读:239  来源: 互联网

标签:typedef Good Feel ll int maxn UVA txt define


题目:

 

思路:

预处理出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;
}

 

标签:typedef,Good,Feel,ll,int,maxn,UVA,txt,define
来源: https://www.cnblogs.com/sykline/p/10352836.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有