P1950 长方形
题目链接:P1950 长方形 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include <iostream>
#include <stack>
#include <cstring>
using namespace std;
char a[1010][1010];
int h[1010], g1[1010], g2[1010];
int main() {
long long n, m, ans = 0;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i] + 1;
for (int j = 1; j <= m; j++) {
if (a[i][j] == '*') {
h[j] = 0;
} else {
h[j]++;
}
}
memset(g1, 0, sizeof(g1));
memset(g2, 0, sizeof(g2));
stack<int>s;
for (int j = 1; j <= m; j++) {
while (!s.empty() && h[s.top()] > h[j]) {
g2[s.top()] = j - 1;
s.pop();
}
s.push(j);
}
while (!s.empty()) {
g2[s.top()] = m;
s.pop();
}
for (int j = m; j >= 1; j--) {
while (!s.empty() && h[s.top()] >= h[j]) {
g1[s.top()] = j + 1;
s.pop();
}
s.push(j);
}
while (!s.empty()) {
g1[s.top()] = 1;
s.pop();
}
for (int j = 1; j <= m; j++) {
ans += (j - g1[j] + 1) * (g2[j] - j + 1) * h[j];
}
}
cout << ans;
return 0;
}
P2032 扫描
题目链接:P2032 扫描 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include <iostream>
#include <deque>
using namespace std;
int a[2000010];
deque<int>d;
int main() {
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= n; i++) {
while (!d.empty() && i - d.front() >= k) {
d.pop_front();
}
while (!d.empty() && a[d.back()] < a[i]) {
d.pop_back();
}
d.push_back(i);
if (i >= k) {
cout << a[d.front()] << endl;
}
}
return 0;
}
参考博客:算法学习笔记(66): 单调队列 - 知乎 (zhihu.com)