ACM - ICPC World Finals 2013 I Pirate Chest
原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf
题目翻译:
问题描述
海盗Dick受够了在公海上厮杀、抢劫、盗窃了,这把生活弄得一塌糊涂。所以他决定隐退,而且他已经找到了一座理想的小岛,只要钱没花完就能在那儿安度余生。他现在有很多金币,他想要把这些金币存在一个宝箱里(毕竟他还是个海盗)。Dick可以建造一个边长都是正整数的长方体宝箱,宝箱底面的长宽不能超过某个特定的尺寸,不过宝箱的高度可以是任意正整数。现在他需要找一个地方把宝箱藏起来。在探索小岛的过程中,他找到了一个好地方。
Dick打算通过把宝箱淹没在一个黑暗的池塘里来藏宝箱。池塘的表面是矩形的,它完全填满了一个山谷的底部,四周都是竖直的悬崖。Dick调查了这个池塘,他在池塘表面建立了平面直角坐标系的网格,并测得了每个单位方格的深度。当宝箱沉入水中时,它会一直下沉直到碰到池底。沉底时,宝箱的顶面会和池塘的表面平行,宝箱的边缘会和网格对齐。宝箱排开了一部分水,这会使池塘的水位上升(即使被宝箱排开的水没有空隙上升也会这样)。四周的悬崖足够高,所以水不会溅出来。当然,由于宝箱不能被别人看到,宝箱的顶面必须严格低于水面。你的任务就是求出Dick能藏下的宝箱的最大体积。
在下图中,左边的图表示池塘的形态,中间的图表示一种体积为3的放置方法,右边的图表示一种体积为4的放置方法。这也是能够藏下的最大体积。注意,如果右边的图的宝箱再变高1单位,它的顶面就能被看到了,因为此时它的顶面和水面一样高。
输入格式
第一行包含四个整数a, b, m, n,表示池塘表面的大小是m*n,宝箱底面一边尺寸不能超过a,另一边的尺寸不能超过b。另外,a和b满足底面为a*b的宝箱不能覆盖整个池塘。
接下来m行,每行n个整数di,j表示方格(i, j)的深度。
输出格式
第一行包含一个整数,表示能完全淹没在池塘里的满足要求的宝箱的最大体积。如果不存在能淹没在池塘里的宝箱,输出0。
样例输入
3 1 2 3
2 1 1
2 2 1
样例输出
4
样例输入
4 1 1 5
2 0 2 2 2
样例输出
12
样例输出
2 3 3 5
2 2 2 2 2
2 2 2 2 2
2 2 2 2 2
样例输出
18
数据规模和约定
1≤a, b, m, n≤500,0≤di,j≤109。
题目大意:
有一个\(m\times n\)的池塘,池塘里面是凹凸不平的,第(i,j)个格有一个深度\(d_{ij}\),要求制作一个箱子(尺寸都是正整数),箱子的两底长分别小于a, b。将其水平放置在池塘底部,箱子会排开与它相等体积的水(但不会溢出),要求保证排开水后箱子的顶部必须严格小于水面,求箱子的最大体积
思路分析:
这道题一上来的感觉有点像之前学过的最大子矩形,一开始的思路是枚举箱子的高度,然后按最大子矩形的搞一搞,但是考虑到数据范围,这样做一定会超时。看一看底边长的范围,感觉复杂度还是\(O(n^3)\)。直接枚举底边位置和边长是\(O(n^4)\)的,我们要想办法给问题降维。通过枚举某一条底边界所在的行,并枚举另一条底边界的长度,可以将任务限制在一个竖直剖面上,然后我们发现单调性之后就可以用一个单调栈维护来求出剖面上的最大矩形,就可以把复杂度做到\(O(n^3)\)了
(今天累了。。。没有力气写得更细致了。。抱歉)
参考代码:
//date 20140126
#include <cstdio>
#include <cmath>
#include <cstring>
inline int getint()
{
int ans(); char w = getchar();
while(w < '' || w > '')w = getchar();
while('' <= w && w <= '')
{
ans = ans * + w - '';
w = getchar();
}
return ans;
}
template <typename T>inline T max(T a, T b){return a > b ? a : b;}
template <typename T>inline T min(T a, T b){return a < b ? a : b;}
inline void swap(int &a, int &b){a ^= b ^= a ^= b;}
const int maxn = ;
int a, b, n, m;
long long S;
int deep[maxn][maxn];
int now[maxn], stack[maxn], len[maxn];
int top;
int mex, tlen;
inline long long solve(int r, int c, int bottom)
{
long long h = (bottom * S - ) / (S - r * c);
return h * r * c;
}
int main()
{
while(scanf("%d%d%d%d", &a, &b, &m, &n) != EOF)
{
S = (long long)m * n;
if(a > b)swap(a, b); //a < b
for(int i = ; i <= m; ++i)
for(int j = ; j <= n; ++j)
deep[i][j] = getint();
long long ans = 0LL;
for(int i = ; i <= m; ++i)
{
memset(now, 0x7F, sizeof now);
for(int j = i; j <= m && j < i + b; ++j)
{
if(j < i + a)mex = b; else mex = a;
for(int k = ; k <= n; ++k)now[k] = min(now[k], deep[j][k]);
stack[top = ] = -; len[] = ;
for(int k = ; k <= n; ++k)
{
tlen = ;
while(stack[top] > now[k])
{
ans = max(ans, solve(j - i + , min(len[top], mex), stack[top]));
if(now[k] < stack[top - ])len[top - ] += len[top];
else tlen += len[top];
--top;
}
stack[++top] = now[k]; len[top] = tlen;
}
while(top > )
{
ans = max(ans, solve(j - i + , min(len[top], mex), stack[top]));
len[top - ] += len[top];
--top;
}
}
}
printf("%I64d\n", ans);
}
return ;
}
需要注意的地方:
求解可行高度时需要进行简单的计算,单调栈中注意还要始终维护当前的最大可行长度
ACM - ICPC World Finals 2013 I Pirate Chest的更多相关文章
- ACM - ICPC World Finals 2013 C Surely You Congest
原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 试题来源 ACM/ICPC World Fin ...
- ACM - ICPC World Finals 2013 A Self-Assembly
原题下载 : http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 这道题其实是2013年我AC的第一道题,非常的开心,这 ...
- ACM - ICPC World Finals 2013 F Low Power
原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 问题描述 有n个机器,每个机器有2个芯片,每个 ...
- ACM - ICPC World Finals 2013 H Матрёшка
原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 问题描述 俄罗斯套娃是一些从外到里大小递减的传 ...
- ACM - ICPC World Finals 2013 D Factors
原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 问题描述 一个最基本的算数法则就是大于1的整数 ...
- ACM - ICPC World Finals 2013 B Hey, Better Bettor
原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 这题真心的麻烦……程序不长但是推导过程比较复杂,不太好想 ...
- [算法竞赛入门经典]Message Decoding,ACM/ICPC World Finals 1991,UVa213
Description Some message encoding schemes require that an encoded message be sent in two parts. The ...
- UVa210 Concurrency Simulator (ACM/ICPC World Finals 1991) 双端队列
Programs executed concurrently on a uniprocessor system appear to be executed at the same time, but ...
- 谜题 (Puzzle,ACM/ICPC World Finals 1993,UVa227)
题目描述:算法竞赛入门经典习题3-5 题目思路:模拟题 #include <stdio.h> #include <string.h> #define maxn 55 char ...
随机推荐
- .NET设计模式(8):适配器模式(Adapter Pattern)(转)
概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就 ...
- #!--->hashbang技术
url中的#! URL 中的 # 本来的用途是跳转到页内锚点.一个 URL 中 # 后的值 (hash tag) 不影响所访问网页的内容,所以搜索引擎在处理仅仅 hash tag 不同的多个 URL ...
- 腾讯开源的轻量级CSS3动画库:JX.Animate
JX.Animate 是由腾讯前端团队 AlloyTeam 推出的一个 CSS3 动画库,通过 JX(腾讯的前端框架)插件的形式提供. Why CSS3 众所周知在支持HTML5的浏览器中 ...
- ol3简介
ol3从根本上进行了重新设计,相对于ol2,他符合现代浏览器的一些设计理念,使用了js新的特性,initial版本的目的是支持原来ol2的大多数功能,支持公网上流行的缓存切片,支持常见的矢量数据格式. ...
- 如何快速查看将C反汇编的代码
查看反汇编主要的思路在于将 流程,处理,算法 区分开来.1 函数调用:原C代码: int sum(int, int);int main(){ int c = sum(1, 2); printf(&qu ...
- 一张思维导图说明jQuery的AJAX请求机制
比文字描述清晰多了吧?而且越是复杂的逻辑,思维导图的作用就越大,同时对阅读源码也是一种快捷的方法. 看不清楚的话可以右键,在新标签页中打开图片,或者保存本地.
- mysql date数据类型异常原因0000-00
1.数据库字段: `dri_lic_first_time` date DEFAULT NULL COMMENT '驾驶证初次领证日期', 2.异常信息 org.springframework.dao. ...
- 去“IOE”
所谓去“IOE”,是对去“IBM.Oracle.EMC”的简称,三者均为海外IT巨头,其中IBM代表硬件以及整体解决方案服务商,Oracle代表数据库,EMC代表数据存储.去“IOE”策略更广泛的理解 ...
- ZJU 1180 Self Numbers(暴力模拟判断,水题)
题目链接 同HDU 1128 , POJ 1316(这个范围小一点). 原本怕超时,以为有技巧或者规律,死命的想,后来发现这就是一道水体,模拟着全部判断一下就好了,10秒呢,完全不怕超时...唔,废话 ...
- java系统属性
java系统属性 1. java.runtime.name:java的运行环境名称. 2. sun.boot.library.path:jdk\jre中的bin的路径 3. java.vm.versi ...