POJ 2796 Feel Good(单调栈)

来源:互联网 发布:阿里云ecs搭建php网站 编辑:程序博客网 时间:2024/06/10 21:10

题目链接:POJ 2796 Feel Good

统计一下前n项和,然后就是普通的单调栈了。

#include <iostream>#include <cstdio>#include <stack>using namespace std;const long long INF = (1 << 60);const int MAX_N = 100000 + 100;struct Node{    int l;    long long h;};long long arr[MAX_N],  sum[MAX_N];int main(){    int n;    while(scanf("%d", &n) != EOF)    {        stack <Node> S;        Node temp, tmp;        long long _max = 0, k, h;        int l, r;        sum[0] = 0;        scanf("%lld", &arr[0]);        sum[0] = arr[0];        for(int i = 1; i < n; i++)        {            scanf("%lld", &arr[i]);            sum[i] = sum[i - 1] + arr[i];        }        for(int i = 0; i < n; i++)        {            temp.l = i, temp.h = arr[i];            while(!S.empty() && temp.h <= S.top().h)            {                tmp = S.top();                S.pop();                if(tmp.l != 0)                    k = tmp.h * (sum[i - 1] - sum[tmp.l - 1]);                else                    k = tmp.h * sum[i - 1];                if(_max < k)                {                    _max = k;                    l = tmp.l + 1;                    r = i;                }                temp.l = tmp.l;            }            S.push(temp);        }        while(!S.empty())        {            tmp = S.top();            S.pop();            if(tmp.l != 0)                k = tmp.h * (sum[n - 1] - sum[tmp.l - 1]);            else                k = tmp.h * sum[n - 1];            if(_max <= k)            {                _max = k;                l = tmp.l + 1;                r = n;            }        }        printf("%lld\n%d %d\n", _max, l, r);    }    return 0;}


0 0
原创粉丝点击