HDU 1506 Largest Rectangle in a Histogram(DP)
2015-11-06 17:47
375 查看
用l[i]和r[i]存i向左向右所能达到的最远的比它高的点,最后扫一遍得出答案。复杂度O(nlogn)。
#include <algorithm> #include <iostream> #include <sstream> #include <cstring> #include <cstdio> #include <vector> #include <string> #include <queue> #include <stack> #include <cmath> #include <set> #include <map> using namespace std; typedef long long LL; #define mem(a, n) memset(a, n, sizeof(a)) #define ALL(v) v.begin(), v.end() #define si(a) scanf("%d", &a) #define sii(a, b) scanf("%d%d", &a, &b) #define siii(a, b, c) scanf("%d%d%d", &a, &b, &c) #define pb push_back #define eps 1e-8 const int inf = 0x3f3f3f3f, N = 1e5 + 5, MOD = 1e9 + 7; int T, cas = 0; int n, m; LL a , l , r ; int main(){ #ifdef LOCAL freopen("/Users/apple/input.txt", "r", stdin); // freopen("/Users/apple/out.txt", "w", stdout); #endif while(si(n), n) { LL ans = 0; l[0] = 0; r[n-1] = n - 1; for(int i = 0; i < n; i ++) scanf("%lld", &a[i]); for(int i = 0; i < n; i ++) { int j = i; while(j && a[i] <= a[j-1]) j = l[j-1]; l[i] = j; } for(int i = n - 2; i >= 0; i --) { int j = i; while(j < n - 1 && a[i] <= a[j+1]) j = r[j+1]; r[i] = j; } for(int i = 0; i < n; i ++) ans = max(ans, a[i] * (r[i] - l[i] + 1)); printf("%lld\n", ans); } return 0; }
相关文章推荐
- 腾讯云相关问题(通过yum装的软件的卸载,mac下通过终端登陆linux服务器及遇到的问题,自动ssh免密码登陆)
- IOC容器——Unity 深度解析(一)
- OC第九天:内存管理初级
- 【BUG】解决SSH2中@Transactional没有回滚,事务处理没有起作用
- Android studio常用快捷键
- linux查看和修改PATH环境变量的方法
- HTML中将背景颜色渐变
- 存储
- windows上MySQL-5.6.27解压缩安装和配置
- php操作Excel文件,将Excel中数据导入到数据库
- 数组与指针详解
- 全球化_农历使用
- Mac快捷键 Xcode快捷键
- LINQ
- 009android初级篇之APP中使用系统相机相册等集成应用
- git pull出现There is no tracking information for the current branch
- 调优 基础 常用工具
- pp Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure.
- 实现NFS HA共享目录
- andorid xml 修改 seekbar 式样