Feel Good(POJ 2796)树状数组+单调栈

题意:

一排数,找到一个区间,使得该区间内 所有数之和乘以该区间内的最小数 最大,输出该最大值和区间左右端点。

Sample Input

6
3 1 6 4 5 2

Sample Output

60
3 5

 

冉了我好久的一道单调栈的题,毕竟我也是刚入门。

注意的一点:ans初值要赋为-1,如果默认赋为0,当我们的数据最大值为0时就无法操作

 

代码如下:

复制代码
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int MX=1e5+100;
int n;
long long a[MX],bit[MX],L[MX],R[MX],stk[MX],top;

int lowbit(int x){
    return x&-x;
}

void update(int x,int add)
{
    for(;x<=n;x+=lowbit(x))
        bit[x]+=add;
}

long long sum(int x)
{
    long long tot=0;
    for(;x;x-=lowbit(x))
        tot+=bit[x];
    return tot;    
}

void sol()
{
    while(top>0) top--;
    for(int i=1;i<=n;++i)
    {
        while(top>0 && a[i]<=a[stk[top]]) top--;
        if(top==0)  L[i]=0;
        else        L[i]=stk[top];
        stk[++top]=i;                 
    }
    
    while(top>0) top--;
    for(int i=n;i>=1;--i)
    {
        while(top>0 && a[i]<=a[stk[top]]) top--; 
        if(top==0)  R[i]=n+1;
        else        R[i]=stk[top];
        stk[++top]=i;
    }
}

long long bin(int l,int r)
{
    return sum(r)-sum(l-1);
}

int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        memset(bit,0,sizeof(bit));
        for(int i=1;i<=n;++i)
        {
            scanf("%d",&a[i]);
            update(i,a[i]);
        }
    
        sol();
        long long ans=-1;
        int l,r;
        for(int i=1;i<=n;++i)
        {
            long long t=bin(L[i]+1,R[i]-1)*a[i];
            if(t>ans)
            {
                ans=t;
                l=L[i]+1;
                r=R[i]-1;
            }
        }
        printf("%lld\n%d %d\n",ans,l,r);
    }
    return 0;
}
/*
6
3 1 6 4 5 2
*/
复制代码

 

本文作者:qseer

本文链接:https://www.cnblogs.com/qseer/p/9398108.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   qseer  阅读(168)  评论(0编辑  收藏  举报
编辑推荐:
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 用 C# 插值字符串处理器写一个 sscanf
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起