01bfs|前缀和的前缀和

单增栈 维护 子数组最小值 左右边界

lc2281

单调栈+前缀和的前缀和+贡献法

计算数组中所有连续子数组的总力量和:每个子数组的总力量 = 子数组里的最小值 × 子数组的元素和,最后把++所有子数组的总力量相加++

单增栈确定++每个元素作为子数组最小值的左右边界++

结合++前缀和的前缀和快速计算子数组强度总和++

最终累加所有元素的贡献得到结果并取模

class Solution {

public:

int totalStrength(vector<int>& strength)

{

const int MOD = 1'000'000'007;

int n = strength.size();

vector<int> left(n, -1);

vector<int> right(n, n);

stack<int> st;

st.push(-1); // 哨兵,方便计算 left[i]

for (int i = 0; i < n; i++) {

while (st.size() > 1 && ++strength[st.top()] >= strength[i]) {
right[st.top()] = i;
++

st.pop();

}

left[i] = st.top();

st.push(i);

}

////////////////////////

long long s = 0; // 前缀和

vector<int> ss(n + 2); // 前缀和的前缀和

for (int i = 1; i <= n; i++) {

s += strength[i - 1];

ss[i + 1] = (ss[i] + s) % MOD;

// 子数组 元素和的元素和

}

long long ans = 0;

for (int i = 0; i < n; i++) {

long long l = left[i] + 1, r = right[i] - 1; // [l,r] 左闭右闭

++long long tot = ((i - l + 1) * (ss[r + 2] - ss[i + 1]) - (r - i + 1) * (ss[i + 1] - ss[l])) % MOD;++

ans = (ans + strength[i] * tot) % MOD; // 累加贡献

}

return (ans + MOD) % MOD;

}

};

lc2290

0-1 BFS,双端队列处理网格移动代价

无障碍(代价0)节点入队首、有障碍(代价1)节点入队尾

求解从网格起点到终点的最小障碍移除数量

喵喵dj版(遇到0就addFirst,优先走短路,0-1BFS通过可插双端队列的队首省了优先队列的排序log,极大地优化了时间复杂度

++if (dis[i][j] + g < dis[x][y])++

dis[x][y] = dis[i][j] + g; //update

++g == 0 ? q.emplace_front(x, y) : q.emplace_back(x, y);++

class Solution {

static constexpr int DIRS[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};

public:

int minimumObstacles(vector<vector<int>> &grid) {

int m = grid.size(), n = grid[0].size();

vector<vector<int>> dis(m, vector<int>(n, INT_MAX));

dis[0][0] = 0;

deque<pair<int, int>> q;

q.emplace_front(0, 0);

while (!q.empty()) {

auto [i, j] = q.front();

q.pop_front();

for (auto& [dx, dy] : DIRS) {

int x = i + dx, y = j + dy;

if (0 <= x && x < m && 0 <= y && y < n) {

int g = grid[x][y];

++if (dis[i][j] + g < dis[x][y]) {++

dis[x][y] = dis[i][j] + g; //update

++g == 0 ? q.emplace_front(x, y) : q.emplace_back(x, y);++

}

}

}

}

return dis[m - 1][n - 1];

}

};

计算新路径的障碍代价,++若新代价更小则更新最短障碍数++

最后根据位置是否为障碍,将节点分别插入双端队列的队首(空地)或队尾(障碍),以此实现0-1 BFS的核心逻辑

相关推荐
CN-Dust20 小时前
【C++】while语句例题专题
数据结构·c++·算法
灵智实验室21 小时前
PX4位置速度估计技术详解(四):LPE 激光雷达高度融合的实现错误
算法·无人机·px 4
CQU_JIAKE21 小时前
【A】3742,3387,并查集
算法
gihigo199821 小时前
CHAN时延估计算法(二维/三维定位实现)
算法
freexyn21 小时前
Matlab自学笔记七十六:表达式的展开、因式分解、化简、合并同类项
笔记·算法·matlab
样例过了就是过了21 小时前
LeetCode热题 不同路径
c++·算法·leetcode·动态规划
dog2501 天前
圆锥曲线和二次曲线
开发语言·网络·人工智能·算法·php
Wadli1 天前
27.单调队列
算法
Navigator_Z1 天前
LeetCode //C - 1031. Maximum Sum of Two Non-Overlapping Subarrays
c语言·算法·leetcode
Wect1 天前
LeetCode 97. 交错字符串:动态规划详解
前端·算法·typescript