
(连续的矩形)HDU - 1506
发布日期:2021-05-06 14:14:30
浏览次数:12
分类:技术文章
本文共 977 字,大约阅读时间需要 3 分钟。
题意:7 2 1 4 5 1 3 3 直接讲数据 :给出7个矩形的高,底长都为1,求最大的连通的矩形块的面积
思路:如果暴力的话肯定超时,有一个特别巧妙的预处理,如果我们知道每一个矩形的左右两边能延伸到哪就好了,这相当于一个并查集:如果我找到了 i ,并且小于等于第 i-1 的高度,那 i-1 的左边界就赋给 i ,向递归一样找下去,直到最左边或者 i 的高度小于左边界的左边。右边界也是这样。
注意:特别注意一下代码中数组的初始化还有最后边界相减加一.
#includelong long f[100010],l[100010],r[100010],n;int main(){ while(~scanf("%lld",&n)&&n) { for(int i=1;i<=n;i++) scanf("%lld",&f[i]); for(int i=1;i<=n;i++) l[i]=r[i]=i;//i点的左右边界初始化为本身 f[0]=-1,f[n+1]=-1;//端点初始化 //相当于并查集 for(int i=1;i<=n;i++) { while(f[i]<=f[l[i]-1])//f[i]与当前边界的前面的点比较 若小于等于 l[i]=l[l[i]-1];//f[i]的左边界l[i]为前面的点的边界 直到小于f[i]为止 } for(int i=n;i>=1;i--) { while(f[i]<=f[r[i]+1])//f[i]与f[i]当前边界的后一个数比较 若小于等于 r[i]=r[r[i]+1];//前面的数的右边界r[r[i]-1]更新最右边界 } long long sum=0,ans=0; for(int i=1;i<=n;i++) { sum=(r[i]-l[i]+1)*f[i];//边界相减加 1 if(ans
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年03月22日 17时59分05秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
wxPython中TextCtrl的输入上限问题
2019-03-01
HTTP状态码解析—— 200、404、503、403等
2019-03-01
2021-ICPD昆明站-I Mr. Main and Windmills
2019-03-01
计时器模仿地球绕太阳圆周运动
2019-03-01
fpga工程师笔试题
2019-03-01
1144. The Missing Number (20)
2019-03-01
为什么阿里巴巴不建议在for循环中使用”+”进行字符串拼接
2019-03-01
tp5.1 页面错误!请稍后再试~ 安装好后,提示错误
2019-03-01
禁止重复提交(JavaScript控制表单…
2019-03-01
php js 通过sotitle(id,arr)函数输入ID取得返回值
2019-03-01
删除外键约束
2019-03-01
c++ 预处理命令 #error 用法
2019-03-01
Qt Creator编码
2019-03-01
Linux部署sendmail邮件服务器
2019-03-01
MyBatis5_动态SQL
2019-03-01
《软件方法》第1章 建模和UML
2019-03-01
ubuntu非root用户如何访问vmware共享文件夹
2019-03-01
图解HTTP (chap4 Http状态码) 5XX
2019-03-01
【今日CV 计算机视觉论文速览 第97期】Tue, 9 Apr 2019
2019-03-01