1 条题解

  • 0
    @ 2025-8-24 23:16:01

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar __liujy
    芳龄 12 的老爷爷。

    搬运于2025-08-24 23:16:01,当前版本为作者最后更新于2025-07-08 08:53:50,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目中的 hhww 在文中用 TTnn 代替。

    设一个楼梯的最下端在第 TT 行,这样就能从改行往上枚举。

    设楼梯的左下角为 (T,l)(T,l),从左往右贪心,每一次让楼梯尽量高就是最优的。

    这个过程可以用单调栈优化,优化的部分为 i=li=l 开始,考虑 aia_{i} 贡献了多少次,找出 ii 后第一个小于 ii 的位置 rir_{i},则 aia_{i} 的贡献为 ai×(rii)a_{i} \times (r_{i}-i),然后每一次 i=rii=r_{i} 往下继续枚举。

    #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;
    }
    
    • 1

    信息

    ID
    12222
    时间
    500ms
    内存
    1000MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者