题解:P12501 「ROI 2025 Day1」奥林匹克楼梯
题目中的
设一个楼梯的最下端在第
设楼梯的左下角为
这个过程可以用单调栈优化,优化的部分为
#include<bits/stdc++.h>
using namespace std;
const int N=4e6+5;
int T,n,a[N],r[N],val[N],ans;
int main()
{
cin>>T>>n;
while(T--)
{
for(int i=1;i<=n;i++)
{
char ch;
cin>>ch;
a[i]=(ch=='0'?0:a[i]+1);
}
stack<int> st;
for(int i=1;i<=n;i++)
{
while(st.size()&&a[st.top()]>a[i])
{
r[st.top()]=i;
st.pop();
}
st.push(i);
}
while(st.size())
{
r[st.top()]=n+1;
st.pop();
}
for(int i=n;i>=1;i--)
{
val[i]=val[r[i]]+a[i]*(r[i]-i);
ans=max(ans,val[i]);
}
}
cout<<ans<<'\n';
return 0;
}