cpp_lib

This documentation is automatically generated by competitive-verifier/competitive-verifier

View the Project on GitHub idat50me/cpp_lib

:heavy_check_mark: ヒストグラム上の最大長方形 (dp/largest_histogram_rectangle.cpp)

なにこれ

ヒストグラム上の最大矩形の面積を求める.

関数

計算量

参考

Verified with

Code

#pragma once

#ifndef call_include
#define call_include
#include <bits/stdc++.h>
using namespace std;
#endif

template<typename T> long long largest_histogram_rectangle(vector<T> &v) {
	v.emplace_back(0);
	int n = v.size();
	long long mxrec = 0;
	stack<pair<T, int>> s;
	for(int i = 0; i < n; i++) {
		int ni = i;
		while(s.size() > 0 and s.top().first > v[i]) {
			long long h = s.top().first, w = i - s.top().second;
			long long rec = h * w;
			if(mxrec < rec) mxrec = rec;
			ni = s.top().second;
			s.pop();
		}
		s.emplace(v[i], ni);
	}
	return mxrec;
}
#line 2 "dp/largest_histogram_rectangle.cpp"

#ifndef call_include
#define call_include
#include <bits/stdc++.h>
using namespace std;
#endif

template<typename T> long long largest_histogram_rectangle(vector<T> &v) {
	v.emplace_back(0);
	int n = v.size();
	long long mxrec = 0;
	stack<pair<T, int>> s;
	for(int i = 0; i < n; i++) {
		int ni = i;
		while(s.size() > 0 and s.top().first > v[i]) {
			long long h = s.top().first, w = i - s.top().second;
			long long rec = h * w;
			if(mxrec < rec) mxrec = rec;
			ni = s.top().second;
			s.pop();
		}
		s.emplace(v[i], ni);
	}
	return mxrec;
}
Back to top page