0
点赞
收藏
分享

微信扫一扫

【算法2-2】线性复杂度优化 / 离散化

90哦吼 2022-02-03 阅读 42
算法c++

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)

举报

相关推荐

0 条评论