題目描述
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...