lsmCC 发表于 2024-2-10 21:37:27

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

#include<iostream>
#include<cstdio>
#include<stack>
#define int long long
using namespace std;
const int Max = 100005;
int a;
int sum;
int l;
stack<int>s;
signed main()
{
        int n;
        cin >> n;
        for(register int i = 1;i <= n;++ i)
                cin >> a,sum = sum + a;
        int M = 0;
        for(register int i = 1;i <= n;++ i)
        {
                while(!s.empty() && a < a)
                {
                        M = max(M,(sum - sum]) * a);
                        s.pop();
                }
                if(!s.empty())
                l = s.top();
                else
                l = 0;
                s.push(i);
        }
        cout << M << endl;
        return 0;
}

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 详细代码注释,有关单调栈