ACM - ICPC World Finals 2013 I Pirate Chest

时间:2023-02-02 16:21:24

原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf

题目翻译:

问题描述

  海盗Dick受够了在公海上厮杀、抢劫、盗窃了,这把生活弄得一塌糊涂。所以他决定隐退,而且他已经找到了一座理想的小岛,只要钱没花完就能在那儿安度余生。他现在有很多金币,他想要把这些金币存在一个宝箱里(毕竟他还是个海盗)。Dick可以建造一个边长都是正整数的长方体宝箱,宝箱底面的长宽不能超过某个特定的尺寸,不过宝箱的高度可以是任意正整数。现在他需要找一个地方把宝箱藏起来。在探索小岛的过程中,他找到了一个好地方。
  Dick打算通过把宝箱淹没在一个黑暗的池塘里来藏宝箱。池塘的表面是矩形的,它完全填满了一个山谷的底部,四周都是竖直的悬崖。Dick调查了这个池塘,他在池塘表面建立了平面直角坐标系的网格,并测得了每个单位方格的深度。当宝箱沉入水中时,它会一直下沉直到碰到池底。沉底时,宝箱的顶面会和池塘的表面平行,宝箱的边缘会和网格对齐。宝箱排开了一部分水,这会使池塘的水位上升(即使被宝箱排开的水没有空隙上升也会这样)。四周的悬崖足够高,所以水不会溅出来。当然,由于宝箱不能被别人看到,宝箱的顶面必须严格低于水面。你的任务就是求出Dick能藏下的宝箱的最大体积。
  在下图中,左边的图表示池塘的形态,中间的图表示一种体积为3的放置方法,右边的图表示一种体积为4的放置方法。这也是能够藏下的最大体积。注意,如果右边的图的宝箱再变高1单位,它的顶面就能被看到了,因为此时它的顶面和水面一样高。

ACM - ICPC World Finals 2013 I Pirate Chest

输入格式

  第一行包含四个整数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 &Mcy;&acy;&tcy;&rcy;&iocy;&shcy;&kcy;&acy;

    原题下载: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&comma; Better Bettor

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

  7. &lbrack;算法竞赛入门经典&rsqb;Message Decoding&comma;ACM&sol;ICPC World Finals 1991&comma;UVa213

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

  8. UVa210 Concurrency Simulator &lpar;ACM&sol;ICPC World Finals 1991&rpar; 双端队列

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

  9. 谜题 (Puzzle&comma;ACM&sol;ICPC World Finals 1993&comma;UVa227&rpar;

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

随机推荐

  1. 分享公司Entity与DTO之间数据拷贝的方法

    主题 最早以前自学java web的时候,数据库查询出来一个Entity对象(CMP对象).就直接传给前台展示了.并没有用到DTO对象,开始并没有觉得有什么不好...后来发现还是需要一些DTO对象来专 ...

  2. ORACLE行转列通用过程

    create or replace procedure row_to_col(tabname in varchar2,                                   group_ ...

  3. 栈的图文解析 和 对应3种语言的实现&lpar;C&sol;C&plus;&plus;&sol;Java&rpar;

    概要 本章会先对栈的原理进行介绍,然后分别通过C/C++/Java三种语言来演示栈的实现示例.注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈.内容包括:1. 栈的介绍2. 栈的C实现3. 栈的 ...

  4. 多XML追加操作

    假设要统计当前系统中所有的试卷进行分析,试卷是以XML格式存储的,所有这就需要将所有零散的XML文件整合起来,处理成一个完整的XML文件,进行分析, 下面是简单额处理方法: 当前XML文件格式: &l ...

  5. Codeforces Round 190 div&period;2 322C 321A Ciel and Robot

    唔...这题是数学题. 比赛时做出来,但题意理解错了,以为只要判断那点是不是在线上就行了,发现过不了样例就没提交. 思路:记录每一步的偏移,假设那点是在路径上的某步,然后回推出那一个周期的第一步,判断 ...

  6. Segment对象

    Segment对象是一个有起点和终点的“线“,也就是说Segement只有两个点,至于两点之间的线是直的,还是曲的,需要其余的参数定义. 所以Segment是由起点,终点和参数三个方面决定的.Segm ...

  7. Java 5种字符串拼接方式性能比较。

    最近写一个东东,可能会考虑到字符串拼接,想了几种方法,但对性能未知,于是用Junit写了个单元测试. 代码如下: import java.util.ArrayList; import java.uti ...

  8. javascript中break,continue和return语句用法小结:

    Break语句会使程序立刻退出包含在最底层的循环或者退出一个switch语句,它是用来退出循环或者switch语句. 例如: <script type="text/javascript ...

  9. 虚拟现实的头戴式设备的视野&lpar;FOV&rpar;原理

    本文原址https://www.cnblogs.com/zhangmiao14/p/5836664.html. 对于VR,它做得最好的就是它对生活的变化,有一些关键因素需要调整的恰如其分.如果做得正确 ...

  10. agora入门案例

    一,下载agora的WebSDK 二,运行index.html 三,输入appID 1.找到appID 2.页面输入appID,查看效果