Description

【题目背景】
小Q最近喜欢上了一款游戏,名为《舰队connection》,在游戏中,小Q指挥强大的舰队南征北战,从而成为了一名
dalao。在游戏关卡的攻略中,可能由于作战过程中某艘船受到严重损伤,为避免沉没而被迫进行返航,这种情况
大家称为这艘船“假摔”。小Q最喜欢使用的一艘战舰代号为P01,但是最近这艘船总是用各种不同的姿势假摔,于
是小Q打算研究一下原因。
【题意描述】
P01的装甲可以近似看作一个n*m的矩阵,每个位置上的数字代表这个位置装甲的强度。当受到炮击时,防御力为被
炮击的部分的所有位置强度之和。最近小Q发现,敌方有一种船只被称为ENE,它可以发射不同形状的炮弹,以达到
攻击装甲最薄弱处的目的。P01已经被连续k次用不同方式打成了严重损伤(假摔),于是小Q打算分析一下ENE的攻击
力。为了简单起见,我们作如下假设:
1、ENE的炮弹形状无论如何变化,火力值都为一个定值(整数,未知)
2、ENE的炮弹形状只能是长方形(ENE:呵呵),且由于口径的限制,炮弹不能太小(具体来说,对于每一发炮弹长xi
宽yi,有xmin<=xi<=n,ymin<=yi<=m)
3、当ENE的炮击命中P01的某处装甲时,被命中部分的强度之和为P01的防御力,此时,ENE的火力必须严格大于P01
的防御力,才能将其击穿并造成严重损伤(假摔)。
然而,小Q并没有得到详细的中弹数据,只知道P01用k种不同的方式假摔过。两种假摔方式不同,当且仅当受到炮
击的位置不完全相同。因此,不同形状的炮弹击穿护甲时必定可以造成不同的假摔方式,而相同形状的炮弹在不同
的位置击穿护甲也能造成不同的假摔方式。现在,小Q想估计ENE的火力最低是多少。于是,这个任务被交给了你。
举例而言,假设P01的护甲为3*4:
0 1 3 7
1 1 5 5
7 6 9 6
如果ENE的口径至少为2*2,那么直接使用2*2的炮弹攻击左上角2*2的装甲时,只要火力>=4即可造成一种假摔。如
果想造成k=3种不同的假摔方式,至少要拥有12的火力,此时可以造成如下三种假摔方式:
1、2*2炮弹,攻击有数字的部分,装甲值为3
0 1 - -
1 1 - -
- - - -
2、2*2炮弹,攻击有数字的部分,装甲值为10
- 1 3 -
- 1 5 -
- - - -
3、2*3炮弹,攻击有数字的部分,装甲值为11
0 1 3 -
1 1 5 -
- - - -
可以证明,火力小于12时,无法造成3种不同的假摔方式,所以ENE的火力至少应为12。

Input

第一行,五个数n, m, xmin, ymin, k,空格分隔。
接下来n行,每行m个数,空格分隔,表示P01的装甲。
1<=n,m<=1000,1<=xmin<=n, 1<=ymin<=m, 1<=k<=250000,装甲值为不超过2000的非负整数。
保证火力为无穷大的ENE可以造成k种不同的假摔方式。

Output

仅一行,一个数,表示ENE的火力最低值。
可以转化为用类似dijkstra求最短路的方法求出离起点最近的k个点,即先把最小的符合要求的矩形(x1,y1,x2,y2)放入堆中,每次出堆时扩展出比其长/宽多1且未入堆的矩形(x1,y1,x2+1,y2)和(x1,y1,x2,y2+1),第k次出堆的矩形的总和+1即为答案
#include<cstdio>
#include<queue>
const int R=1e7,P=;
char buf[R],*ptr=buf-;
int _(){
int x=,c=*++ptr;
while(c<)c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x;
}
typedef unsigned long long u64;
int n,m,n1,m1,k,ans=;
int s[][];
u64 hs[P];
struct node{
int v,x1,y1,x2,y2;
};
bool operator<(const node&a,const node&b){
return a.v>b.v;
}
std::priority_queue<node>q;
inline void push(int x1,int y1,int x2,int y2){
if(x1<||y1<||x2>n||y2>m)return;
u64 hv=(u64(x1<<|y1)<<|x2)<<|y2;
int w=hv%P;
while(hs[w]){
if(hs[w]==hv)return;
if((w+=)>=P)w-=P;
}
hs[w]=hv;
int v=s[x1][y1]+s[x2][y2]-s[x1][y2]-s[x2][y1];
q.push((node){v,x1,y1,x2,y2});
}
int main(){
fread(buf,,R,stdin);
n=_();m=_();n1=_();m1=_();k=_();
for(int i=;i<=n;++i){
for(int j=;j<=m;++j)s[i][j]=_()+s[i][j-];
for(int j=;j<=m;++j)s[i][j]+=s[i-][j];
}
for(int i=n1;i<=n;++i){
for(int j=m1;j<=m;++j){
push(i-n1,j-m1,i,j);
}
}
while(k--){
node w=q.top();q.pop();
ans=w.v;
push(w.x1,w.y1,w.x2+,w.y2);
push(w.x1,w.y1,w.x2,w.y2+);
}
printf("%d",ans+);
return ;
}

bzoj4716 假摔的更多相关文章

  1. bzoj4716假摔

    bzoj4716假摔 题意: 给出一个矩阵,求这个矩阵中权值和第k小的长在xmin到n之间,宽在ymin到m之间的子矩阵.n,m≤1000,k≤250000. 题解: 首先求出长为xmin,宽为ymi ...

  2. 【BZOJ4716】假摔 二分+暴力

    [BZOJ4716]假摔 Description [题目背景] 小Q最近喜欢上了一款游戏,名为<舰队connection>,在游戏中,小Q指挥强大的舰队南征北战,从而成为了一名dalao. ...

  3. 轮滑基础(一)(前摔,葫芦步,推步,A字转弯,弓步转弯)

    轮滑新手入门推荐? [柚子陪你学轮滑轮滑教学]第一集 轮滑安全 1,站: 站立:脚可以成v字,或者平行,手放膝盖或者前伸.平行站立 膝盖相距一拳头左右,两腿间距略小于肩宽.膝盖略弯,腰下压,抬头挺胸 ...

  4. fzu月赛 2203 单纵大法好 二分

    Accept: 8    Submit: 18Time Limit: 5000 mSec    Memory Limit : 65536 KB  Problem Description 人在做,天在看 ...

  5. CSS样式的特点与优先选择权

    CSS样式的特点:(子元素会继承父元素的某些样式,子元素有自己的样式就用自己的样式,没有的就用父元素的)      1.继承:              网页中子元素,将继承父元素的样式(比如要控制p ...

  6. CSS文字控制与文本控制

    一.CSS控制文字属性: 1.font-size:18px;:设置字号(默认是16px=1em),一般在制作网页的时候,先在body里同一设置下字体大小2.color:#093:设置字色3.font- ...

  7. CSS选择符类型

    一.标签选择符:针对某一类标签,可以以标签作为选择符 <style type="text/css"> p{color:#F00; font-size:36px;} &l ...

  8. CSS_简介/语法结构/长度单位/应用方式/标签的样式重置/表单样式重置

    一.CSS简介:  w3c(World Wide Web Consortium):万维网联盟,是规定网页标准的一个组织(叫做Web标准) Web标准:是由w3c和其他标准化组织制定的一系列标准的集合, ...

  9. HTML+CSS D08浮动

    1. <html> <head> <title>div浮动</title> <style type="text/css"> ...

随机推荐

  1. UDP 打洞 原理解释

    终于找到了一份满意的UDP打洞原理解释,附上正文,自己整理了一下源码 3.3. UDP hole punching UDP打洞技术 The third technique, and the one o ...

  2. iOS学习笔记---oc语言第十天

    内存管理高级 一 属性的内部实现原理   assign   retain    copy assign 下的属性内部实现 setter方法 @property(nonatomic,assign)NSS ...

  3. ZPPR001-(展bom)

    ************************************************************************ Title : ZPPR010 ** Applicat ...

  4. Oracle数据库五种约束

    oracle 数据库 数据表的5个约束类型:1.主键约束2.外键约束3.唯一约束4.检查约束5.非空约束 主键约束:用来唯一标示表中的一个列,一个表中的主键约束只能有一个,但是可以在一个主键约束中包含 ...

  5. Floating Action Button(漂浮按钮)

    参考:http://blog.csdn.net/pengkv/article/details/46427891 效果图: 步骤一: 在build.gradle添加以下代码,导入包 dependenci ...

  6. Python合并两个numpy矩阵

    numpy是Python用来科学计算的一个非常重要的库,numpy主要用来处理一些矩阵对象,可以说numpy让Python有了Matlab的味道. 实际的应用中,矩阵的合并是一个经常发生的操作,如何利 ...

  7. 怎么用ABBYY创建属于自己的PDF

    怎么创建一份属于自己的PDF文档呢?由于PDF格式文件具有跨平台.支持超长文件.安全可靠性高等诸多优势,在日常办公学习中应用越来越广泛.而随着技术的发展,各种办公软件也对PDF提供越来越多的支持,但P ...

  8. 二十四种设计模式:状态模式(State Pattern)

    状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...

  9. jQuery-vsdoc.js文件是vs中的JavaScript intellisense,

    在VS 2008中启用jQuery Intellisense的步骤 要在VS中启用jQuery的intellisense完成,你要遵循三个步骤: 第一步: 安装VS 2008 SP1 VS 2008 ...

  10. ASP.NET 各种缓存

    原文地址:http://www.cnblogs.com/ltp/archive/2009/06/30/1514311.html   有时候总听到网友说网站运行好慢,不知如何是好:有时候也总见到一些朋友 ...