P2422 良好的感觉
1.P8784 [蓝桥杯 2022 省 B] 积木画2.P9847 [ICPC2021 Nanjing R] Crystalfly3.G. Vlad and Trouble at MIT4.P2899 [USACO08JAN] Cell Phone Network G5.P5322 [BJOI2019] 排兵布阵6.P2946 [USACO09MAR] Cow Frisbee Team S7.P1156 垃圾陷阱8.P1064 [NOIP2006 提高组] 金明的预算方案9.P2466 [SDOI2008] Sue 的小球10.P5020 [NOIP2018 提高组] 货币系统11.P1757 通天之分组背包12.P2135 方块消除13.D - String Bags14.P4395 [BOI2003] Gem 气垫车15.A - A Multiply16.P2642 双子序列最大和17.P1121 环状最大两段子段和
18.P2422 良好的感觉
19.P2854 [USACO06DEC] Cow Roller Coaster S20.C. Theofanis' Nightmare21.D. Birthday Gift22.P1284 三角形牧场23.P1353 [USACO08JAN] Running S24.P8736 [蓝桥杯 2020 国 B] 游园安排25.P1470 [USACO2.3] 最长前缀 Longest Prefix26.P7859 [COCI2015-2016#2] GEPPETTO27.P1435 [IOI2000] 回文字串28.P2340 [USACO03FALL] Cow Exhibition G29.P1854 花店橱窗布置30.P3147 [USACO16OPEN] 262144 P31.Game on Tree32.P2938 [USACO09FEB] Stock Market G33.P9691 [GDCPC2023] Base Station Construction34.P8624 [蓝桥杯 2015 省 AB] 垒骰子35.E. Money Buys Happiness36.P8675 [蓝桥杯 2018 国 B] 搭积木37.P8774 [蓝桥杯 2022 省 A] 爬树的甲壳虫38.P8806 [蓝桥杯 2022 国 B] 搬砖39.P5662 [CSP-J2019] 纪念品40.B. Mashmokh and ACM41.C. Minimizing the Sum42.H. Don't Blame Me43.D. Bicolorings44.D. Armchairs45.C. Chef Monocarp46.D. Invertible Bracket Sequences47.P1351 [NOIP2014 提高组] 联合权值48.D. World is Mine49.F. Feed Cats50.P3522 [POI2011] TEM-Temperature51.P3572 [POI2014] PTA-Little Bird52.P3089 [USACO13NOV] Pogo-Cow S53.E - Maximum Glutton54.Projects55.Elevator Rides题解
1.我们没法遍历每个区间然后找出他们的最小值,所以我们考虑每个元素对答案的贡献
2.对于每一个元素来说,它的贡献等于它所在的区间长度乘上自身的值,这里的区间指的是以它为最小值的区间
3.以每个元素为最小值的区间要怎么求呢?我们将其转换成求左边第一个小和右边第一个小
对于这种问题(求序列中最近最小元素),我们建立一个栈,然后线性遍历,维护栈使其从底到顶下标有序,值也有序
如果是求左边最小值的话,我们维护栈内元素的下标成升序,值成降序。这样一来,我们可以遍历栈来找到左边第一个最小值了(有点像把升序折叠起来了?反正是个子问题)
右边同理
注意不同题细节不同,这里我们遍历找到的是第一个比i小的元素,所以它们不算在内i对答案的贡献内,空栈的含义是没有比自己小的,那就赋为端点
code
#include<bits/stdc++.h>
using namespace std;
int a[100005]={0},pre[100005]={0},l[100005]={0},r[100005]={0};
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
pre[i]=pre[i-1]+a[i];
}
stack<int> q;
for(int i=1;i<=n;i++)
{
while(q.size()&&a[q.top()]>=a[i]) q.pop();
if(q.size()) l[i]=q.top();
else l[i]=0;
q.push(i);
}
stack<int> q2;
for(int i=n;i>=1;i--)
{
while(q2.size()&&a[q2.top()]>=a[i]) q2.pop();
if(q2.size()) r[i]=q2.top();
else r[i]=n+1;
q2.push(i);
}
int ans=0;
for(int i=1;i<=n;i++) ans=max(ans,a[i]*(pre[r[i]-1]-pre[l[i]]));
cout<<ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~