51nod 1102 面积最大的矩形】的更多相关文章

链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1102 思路: 首先介绍下单调栈的功能:利用单调栈,可以找到从左/右遍历第一个比它小/大的元素的位置.时间复杂度为O(n). 这道题要找最大的矩形的面积,我们可以假设i为矩形最低的高,那么对每一个i找到向左走第一个比他小的l[i],和向右走第一个比他小的r[i]. 我们可以知道当前矩阵最大为:a[i] * (l[i]-1-(r[i]-1)+1);对所有i的值取最大…
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1102 题意: 思路: 做法就是求出每个长方形向左向右所能延伸的最大距离. 我这里用单调栈来做,维护一个单调递增的栈(自底向上递增),如果当前值大于栈顶,那么直接进栈,如果小于的话,那就说明前面比它大的那些数最多只能延伸到它这里.自己手动模拟一下就可以了. #include<iostream> #include<algorithm> #include<…
题目地址在这儿 求取:以某矩形g[i]为最小值的区间的左右端点,得到一个临时解.所有临时解中的最大值即为解. 求取区间的方法可以用单调栈,也可以用下面这种十分简洁的类似于递归的方法.下面这种解法求出来的区间是开区间,也正是因为开区间,所以跳转很方便. L[i]是以第i根柱子为最小值的左开区间点.若g[i] <= g[L[i]],则L[i]=L[L[i]]: 打个比方,柱子高度为1,3,9,7,5.g[4]=7,一开始L[4]初始化为3,那么若g[4]<=g[L[4]],即7=g[4]<=…
题面1:  题面2:  两道题除了数据范围不同,没有任何差异,两道题都可以o(n)(单调栈),o(nlog(n))(我自己的做法)解决. 解题思路1:(单调栈) 对于每个点找到右边第一个比它小的位置con1,并且找到左边第一个比它小的位置con2. 对于每个点更新答案为ans = max(ans, (con2-con1-1)*value[i]). 1的做法是两次裸的单调栈,时间复杂度为o(n). 代码1: #include <bits/stdc++.h> using namespace s…
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1102 1102 面积最大的矩形 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 有一个正整数的数组,化为直方图,求此直方图包含的最大矩形面积.例如 2,1,5,6,2,3,对应的直方图如下:     面积最大的矩形为5,6组成的宽度为2的矩形,面积为10. Input 第1行:1个数N,表示数组的长度(0 <= N <=…
class Rectangle { private double len, wid; public Rectangle()//求矩形周长 { len = 0; wid = 0; } public Rectangle(int l, int w)//求矩形面积 { len = l; wid = w; } public double perimeter()//求周长 { return ((len + wid) * 2); } public double area()//求面积 { return (le…
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1559 波雷卡普有一个n×m,大小的棋盘,上面有k个车.他又放了q个矩形在上面.每一个矩形要受到保护.矩形受到保护的意思是对于该矩形内部所有的格子能够被这个矩形内的某个车攻击到或者被占据,和矩形外面的车无关,即矩形外面的车不能攻击到矩形里面.车的位置是固定的. 样例解释: 对于最后一个矩形,用红色框框表示的,因为(1,2)不能被某个车攻击到,所以是NO. 题其实不难,但是…
覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7985    Accepted Submission(s): 4038 Problem Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积.   Input 输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试…
题解 离线读入,我们发现一个矩形能被保护,矩形内部所有列上必定有一辆车,或者所有行上必定有一辆车 分两次进行处理 第一次按照横坐标把车加进去,然后查询最大横坐标在这个位置的矩形,纵坐标区间里的车出现位置的最小值有没有超过最小横坐标 第二次按照纵坐标把车加进去,然后查询最大纵坐标所在位置的矩形,横坐标区间里的车出现位置的最小值有没有超过最小纵坐标 用线段树维护区间即可 代码 #include <iostream> #include <algorithm> #include <c…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 需要保存区间覆盖线>=2的线段的长度,根据情况来更新... //STATUS:C++_AC_250MS_476KB #include <functional> #include <algorithm> #include <iostream> //#include <ext/rope> #include <fstream> #include…