鱼C论坛

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

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

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

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

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

x
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<stack>
  4. #define int long long
  5. using namespace std;
  6. const int Max = 100005;
  7. int a[Max];
  8. int sum[Max];
  9. int l[Max];
  10. stack<int>s;
  11. signed main()
  12. {
  13.         int n;
  14.         cin >> n;
  15.         for(register int i = 1;i <= n;++ i)
  16.                 cin >> a[i],sum[i] = sum[i - 1] + a[i];
  17.         int M = 0;
  18.         for(register int i = 1;i <= n;++ i)
  19.         {
  20.                 while(!s.empty() && a[i] < a[s.top()])
  21.                 {
  22.                         M = max(M,(sum[i - 1] - sum[l[s.top()]]) * a[s.top()]);
  23.                         s.pop();
  24.                 }
  25.                 if(!s.empty())
  26.                 l[i] = s.top();
  27.                 else
  28.                 l[i] = 0;
  29.                 s.push(i);
  30.         }
  31.         cout << M << endl;
  32.         return 0;
  33. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-10 21:37:44 | 显示全部楼层
以下是对代码的详细注释:

  1. #include <iostream>
  2. #include <stack>
  3. #define int long long // 将int类型定义为长整型
  4. using namespace std;
  5. const int Max = 100005; // 定义最大值为100005

  6. signed main()
  7. {
  8.     int n; // 输入n的值
  9.     cin >> n;
  10.    
  11.     int a; // 定义a的值
  12.     int sum = 0; // 初始化sum为0
  13.     int l; // 定义l的值
  14.    
  15.     stack<int> s; // 定义整型栈s
  16.    
  17.     for (register int i = 1; i <= n; i++) // 从1到n进行循环
  18.     {
  19.         cin >> a; // 输入a的值
  20.         
  21.         // 在栈s不为空且栈顶元素大于等于a时,一直将栈顶元素弹出,并更新sum的值
  22.         while (!s.empty() && s.top() >= a)
  23.         {
  24.             s.pop();
  25.             sum += a;
  26.         }
  27.         
  28.         // 如果栈s为空,则l的值为0;否则,l的值为栈s的栈顶元素下标+1
  29.         if (s.empty())
  30.             l = 0;
  31.         else
  32.             l = s.top() + 1;
  33.         
  34.         // 将当前元素a入栈
  35.         s.push(i);
  36.         
  37.         // 更新sum的值(sum累加的是l到当前位置i的元素之和)
  38.         sum += (i - l) * a;
  39.     }

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

  41.     return 0;
  42. }
复制代码


这段代码使用单调栈的思想,计算了一个序列中所有子序列的和。具体的实现过程如下:
- 首先,从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-4-28 23:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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