原题下载: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. quickeys 过期解决办法

    自己在系统中找了大半天,终于发现了一个叫.com.quickeys.quickeysX3.plist的文件,存在于硬盘的 ~/Library/Preferences/ 目录下,直觉感觉文件的大体内容应 ...

  2. Extjs整体加载树节点

    Ext.onReady(function () {             Ext.define('company', {                 extend: 'Ext.data.Mode ...

  3. vi/vim使用指北 ---- Learning the vi and Vim Editors 读书 笔记

    vi/vim作为liux系统下最强大,最流行的文本编辑器之一.边看<Learning the vi and vim Editor>边学习vim,顺便做写简单的笔记,供以后查询. 没看这本书 ...

  4. 谈JavaScript组合拼接字符串的效率 --转载

    JavaScript组合拼接字符串的效率.在脚本开发过程中,经常会按照某个规则,组合拼接出一个大字符串进行输出.比如写脚本控件时控制整个控件的外观的HTML标签输出,比如AJAX里得到服务器端的回传值 ...

  5. GCD的简单封装

    扩展: dispatch_block_t :无参数block,使用起来很简单 下载链接:http://pan.baidu.com/s/1bndN6Yb    ]; }     //定时器 - (voi ...

  6. YAPF:Google开源的Python代码格式化工具

    点这里 现在的大多数 Python 代码格式化工具(比如:autopep8 和 pep8ify)是可以移除代码中的 lint 错误.这显然有些局限性.比如:遵循 PEP 8 指导的代码可能就不会被格式 ...

  7. ***mysql索引总结----mysql索引类型以及创建

    文章归属:http://feiyan.info/16.html,我想自己去写了,但是发现此君总结的非常详细.直接搬过来了 关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基 ...

  8. IDTHook 深入学习

    在之前的一篇文章中介绍了替换IDT向量表中的地址来达到Hook的目的 IDT hook KiTrap03 但是这样很容易就可以被检测了.接下来要学习就是通过patch GDT来达到Hook IDT的目 ...

  9. spring_150806_hibernate_non_transaction

    添加hibernate的相关jar包! 实体类: package com.spring.model; import javax.persistence.Entity; import javax.per ...

  10. 李洪强iOS开发之计算数组的最大最小值

    // //  ViewController.m //  A21 - 李洪强 - 输出参数 // //  Created by vic fan on 16/7/3. //  Copyright © 20 ...