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 */
从0到1很难,但从1到100很容易
本文作者:qseer
本文链接:https://www.cnblogs.com/qseer/p/9398108.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· 趁着过年的时候手搓了一个低代码框架
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现