原题下载: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的更多相关文章

  1. ACM - ICPC World Finals 2013 C Surely You Congest

    原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 试题来源 ACM/ICPC World Fin ...

  2. ACM - ICPC World Finals 2013 A Self-Assembly

    原题下载 : http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 这道题其实是2013年我AC的第一道题,非常的开心,这 ...

  3. ACM - ICPC World Finals 2013 F Low Power

    原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 问题描述 有n个机器,每个机器有2个芯片,每个 ...

  4. ACM - ICPC World Finals 2013 H Матрёшка

    原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 问题描述 俄罗斯套娃是一些从外到里大小递减的传 ...

  5. ACM - ICPC World Finals 2013 D Factors

    原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 问题描述 一个最基本的算数法则就是大于1的整数 ...

  6. ACM - ICPC World Finals 2013 B Hey, Better Bettor

    原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 这题真心的麻烦……程序不长但是推导过程比较复杂,不太好想 ...

  7. [算法竞赛入门经典]Message Decoding,ACM/ICPC World Finals 1991,UVa213

    Description Some message encoding schemes require that an encoded message be sent in two parts. The ...

  8. UVa210 Concurrency Simulator (ACM/ICPC World Finals 1991) 双端队列

    Programs executed concurrently on a uniprocessor system appear to be executed at the same time, but ...

  9. 谜题 (Puzzle,ACM/ICPC World Finals 1993,UVa227)

    题目描述:算法竞赛入门经典习题3-5 题目思路:模拟题 #include <stdio.h> #include <string.h> #define maxn 55 char ...

随机推荐

  1. ASP.NET输出PNG图片时出现GDI+一般性错误的解决方法

    偶原来的用ASP.NET生成验证码图片时用的是JPG格式,今天想把它改成PNG格式的,结果就出现GDI+一般性错误,查了N久资料,才发现解决的办法,对分享此解决办法的网友深表感谢 Response.C ...

  2. Winform设置相关

    >>  Winform查找根目录 1) AppDomain.CurrentDomain.BaseDirectory 地址为: d:\MyProject\Bin\  Application. ...

  3. Ruby Profiler 详解之 stackprof

    简介 stackprof 是基于采样的一个调优工具,采样有什么好处呢?好处就是你可以线上使用,按照内置的算法抓取一部分数据,只影响一小部分性能.它会产生一系列的 dump 文件,然后你在线下分析这些文 ...

  4. SGU 102

    For given integer N (1<=N<=104) find amount of positive numbers not greater than N that coprim ...

  5. 处理HTTP状态码

    1.1.4  处理HTTP状态码 上一节介绍HttpClient访问Web资源的时候,涉及HTTP状态码.比如下面这条语句: int statusCode=httpClient.executeMeth ...

  6. 由CAST()函数在.NET1.1和.NET4.0下处理机制不同所引发的BUG

     .NET 1.1版本下使用日期强制转换函数,比如:"select cast(ActionDate as char(7)) as ActionDate  from ST_BookAction ...

  7. shell脚本替换文件中字符

    1.将当前目录下包含jack串的文件中,jack字符串替换为tom sed -i "s/jack/tom/g" `grep "jack" -rl ./` 2.将 ...

  8. 李洪强iOS开发之OC点语法和变量作用域

    OC点语法和变量作用域 一.点语法 (一)认识点语法 声明一个Person类: 1 #import <Foundation/Foundation.h> 2 3 @interface Per ...

  9. ADs系列之通用数据解析服务GAS(即将开源)

    面对成百上千的生产系统用户操作数据接入落地,你是否厌倦了每次机械编写打包解包的代码?对一次性接入多个数据的时候,还要对不同人联调,费时费力,你是否还会手忙脚乱,忙中不断出错?是否当数据出问题了,用的时 ...

  10. 求一个全排列函数: 如p([1,2,3])输出:[123],[132],[213],[231],[312],[321]. 求一个组合函数 如p([1,2,3])输出:[1],[2],[3],[1,2],[2,3],[1,3],[1,2,3]

    深度搜索的代码: #include<stdio.h> #include<string.h> ; int n; int a[Max]; bool b[Max]; void Dfs ...