作业介绍
【算法入门-16】贡献法和单调栈
-
课件
-
单调栈模板
int gao(const vector<int>& a) {
int n = a.size();
// L(i): 左边第一个 <= a[i] 的数的下标
vector<int> L(n, -1);
// R(i): 右边第一个 < a[i] 的数的下标
vector<int> R(n, n);
vector<int> s(n); // 用来从左往右放入 a[i]
int e = 0; // s 中元素的个数
for (int i = 0; i < n; i++) {
// 在 s 里从后往前找到第一个 <= a[i]
// 拿出的时候确定右边第一个 < a[s[e - 1]] 的就是 a[i]
while (e > 0 && a[s[e - 1]] > a[i]) R[s[--e]] = i;
// 放入的时候确定左边第一个 <= a[i] 的
if (e != 0) L[i] = s[e - 1];
s[e++] = i;
}
i64 ans = 0;
for (int i = 0; i < n; i++) {
ans = (ans + (i64) (i - L[i]) * (R[i] - i) * a[i]) % P;
}
return ans;
}
题目
| 状态 | 最后递交于 | 题目 |
|---|---|---|
| 2025-12-14 21:16:31 | LS1247 【普及】接雨水 | |
| 2025-11-9 22:55:05 | LS1243 【入门】子数组之和 | |
| 2025-11-9 23:15:44 | LS1244 【普及】子数组的最小值之和 | |
| 2025-11-9 23:24:32 | LS1199 【普及】柱状图中最大的矩形 | |
| 2025-11-9 23:35:55 | LS1200 【普及】最大矩形 | |
| 2025-11-9 23:54:37 | LS1245 【普及】子数组的最值之差 | |
| 2025-11-10 0:00:41 | LS1246 【普及】子序列的最值之差 | |
| 2025-11-10 0:09:22 | LS1248 【普及】二进制中1的个数 | |
| 2025-11-10 0:19:17 | LS1249 【普及】异或和 |
- 状态
- 正在进行…
- 题目
- 9
- 开始时间
- 2025-11-8 8:00
- 截止时间
- 2027-8-16 23:59
- 可延期
- 24 小时