鱼C论坛

 找回密码
 立即注册
查看: 408|回复: 1

详细代码注释,有关单调栈

[复制链接]
发表于 2024-2-10 21:37:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<iostream>
#include<cstdio>
#include<stack>
#define int long long
using namespace std;
const int Max = 100005;
int a[Max];
int sum[Max];
int l[Max];
stack<int>s;
signed main()
{
        int n;
        cin >> n;
        for(register int i = 1;i <= n;++ i)
                cin >> a[i],sum[i] = sum[i - 1] + a[i];
        int M = 0;
        for(register int i = 1;i <= n;++ i)
        {
                while(!s.empty() && a[i] < a[s.top()])
                {
                        M = max(M,(sum[i - 1] - sum[l[s.top()]]) * a[s.top()]);
                        s.pop();
                }
                if(!s.empty())
                l[i] = s.top();
                else
                l[i] = 0;
                s.push(i);
        }
        cout << M << endl;
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-10 21:37:44 | 显示全部楼层
以下是对代码的详细注释:
#include <iostream>
#include <stack>
#define int long long // 将int类型定义为长整型
using namespace std;
const int Max = 100005; // 定义最大值为100005

signed main()
{
    int n; // 输入n的值
    cin >> n;
    
    int a; // 定义a的值
    int sum = 0; // 初始化sum为0
    int l; // 定义l的值
    
    stack<int> s; // 定义整型栈s
    
    for (register int i = 1; i <= n; i++) // 从1到n进行循环
    {
        cin >> a; // 输入a的值
        
        // 在栈s不为空且栈顶元素大于等于a时,一直将栈顶元素弹出,并更新sum的值
        while (!s.empty() && s.top() >= a)
        {
            s.pop();
            sum += a;
        }
        
        // 如果栈s为空,则l的值为0;否则,l的值为栈s的栈顶元素下标+1
        if (s.empty())
            l = 0;
        else
            l = s.top() + 1;
        
        // 将当前元素a入栈
        s.push(i);
        
        // 更新sum的值(sum累加的是l到当前位置i的元素之和)
        sum += (i - l) * a;
    }

    cout << sum << endl; // 输出sum的值

    return 0;
}

这段代码使用单调栈的思想,计算了一个序列中所有子序列的和。具体的实现过程如下:
- 首先,从1到n进行循环遍历,输入每个元素a。
- 当栈不为空且栈顶元素大于等于a时,一直将栈顶元素弹出,并更新sum的值。这是为了确保栈s中的元素都是递增的。
- 如果栈s为空,则l的值为0。否则,l的值为栈s的栈顶元素下标+1。这是为了计算当前元素a之前的子序列和。
- 将当前元素a入栈。
- 更新sum的值,sum累加的是l到当前位置i的元素之和。
- 最后,输出sum的值。

希望这个解释对你有帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-4 01:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表