ABC359
E
题目很简单,大概就是要求数组中一个数的左侧第一个比它大的值。这里就需要用单调栈来实现了。
单调栈
单调栈就是通过栈的性质,来实现快速查找一个数的左侧第一个比他大的数。
- 过程
创建一个栈,判断栈顶元素是否小于当前元素,如果小于则将栈顶元素弹出直到栈顶元素大于当前元素,最后将当前元素压入栈。 - 原理
因为对所有的值的处理只会有判断和弹出,元素不会被重复遍历。所以可以实现O(n)的时间复杂度。
代码实现
void solve()
{
i64 n;
std::cin>>n;
std::vector<i64>a(n+1),ans(n+1);
for(int i=0;i<n;i++){
std::cin>>a[i];
}
std::stack<i64>st;
ans[0]=a[0];
i64 maxn=a[0];
i64 num=0;
st.push(0);
for(int i=1;i<n;i++){
while(!st.empty()&&a[st.top()]<a[i]){//这里就是单调栈的实现,由于题目需求,这里栈压入的是数组元素的下标
st.pop();
}
if(!st.empty()){
ans[i]=(i-st.top())*a[i]+ans[st.top()];
}else{
ans[i]=(i+1)*a[i];
}
st.push(i);
}
for(int i=0;i<n;i++){
std::cout<<ans[i]+1<<" ";
}
std::cout<<"\n";
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?