2016 11 2 第二題 洛谷1565

2021-07-24 08:09:09 字數 1989 閱讀 4187

題目描述

ap 神牛準備給自己蓋一座很華麗的宮殿。於是,他看中了一塊n*m 的矩形空地。

空地中每個格仔都有自己的海拔高度。ap 想讓他的宮殿的平均海拔在海平面之上(假設

海平面的高度是0,平均數都會算吧?)。而且,ap 希望他的宮殿盡量大,能夠容納更

多的人來膜拜他。請問ap 的宮殿最後會有多大?

輸入輸出格式

輸入格式:

第一行為n 和m。之後n 行,每行m 個數,描述的空地的海拔。

輸出格式:

輸出一行,表示宮殿最大面積。

輸入輸出樣例

輸入樣例#1:

3 2

4 0

-10 8

-2 -2

輸出樣例#1:

4分析:

dp+單調棧。

這道題很像最大子矩陣。但是是求面積大於0的最大子矩陣。我們考慮像普通求法一樣列舉左右邊界,用字首和表示1~i行的總和。後面畫圖可知單調棧的操作。

**:

var

n,m,ans,top:int64;

e:int64;

f:array [0..202] of int64;

stack:array [0..202] of int64;

sum:array [0..202,0..202] of int64;

procedure

init;

var x,i,j:longint;

begin

readln(n,m);

for i:=1

to n do

for j:=1

to m do

begin

read(x);

sum[i,j]:=sum[i,j-1]+x;

end;

end;

function

max(x,y:int64):int64;

begin

if x>y then

exit(x)

else

exit(y);

end;

function

erf(x:int64):int64;

var l,r,mid,w:longint;

begin

l:=1; r:=top; w:=-1;

while l<=r do

begin

mid:=(l+r) shr

1; if stack[mid]then

begin w:=mid; r:=mid-1; end

else l:=mid+1;

end;

exit(w);

end;

procedure

dp;var i,j,k:longint;

a,w:int64;

begin

for i:=1

to m do

for j:=i to m do

begin

e:=0; stack[0]:=maxlongint; top:=0;

for k:=1

to n do

begin

a:=sum[k,j]-sum[k,i-1];

e:=e+a;

if e>0

then ans:=max(ans,k*(j-i+1))

else

begin

w:=erf(e);

if (w<>-1) then ans:=max(ans,(k-f[w])*(j-i+1));

end;

if ethen

begin

inc(top);

stack[top]:=e;

f[top]:=k;

end;

end;

end;

end;

begin

init;

dp;writeln(ans);

end.

課上洛谷刷題第二天

今天,主講老師有事去了,換了個代課老師來上課。但是有些同學這就開始八卦了起來 本來這個班的主講老師並不是現在的主講老師的,可是原來的主講老師有事,找了個代課老師來上課。第二節課,同學們依然沒有見到他們的主講老師,代課老師說他去談戀愛不知道幹嘛了,自己就變成了主教 老師。而這節課主教老師又有事去了,會...

洛谷 模擬題

這道題一直wa?最後看了題解終於過了 include using namespace std typedef long long ll const int ma 10005 int n int a ma 4 intmain int x,y cin x y for int i n 1 i 0 i co...

洛谷簽到題

題目描述 一天 cyx 閒得無聊,寫下了 nn 個數,每個數隻會是 11 或 22,每個數是 11 的概率和是 22 的概率都是 50 50 現在 cyx 想知道他寫的這 nn 個數的和,可他寫的數太多了,他根本算不了,所以他就想知道總和的期望值。你能告訴他麼?輸入格式 乙個整數 nn,表示 cyx...