program as;
var a,b : array[0..2000,0..2000]of longint;
c : array[0..2000,1..2]of longint;
n,m,i,j,l,cfx,zfx : longint;
function
min(a,b : longint):longint;
begin
if a>b then
exit(b);
exit(a);
end;
procedure
chuli
(l,r,j:longint);
begin
for l:=l to r do
begin
if c[l,1] *(j-c[l,2])>cfx then
cfx:=c[l,1] *(j-c[l,2]);
if ((j-c[l,2])>zfx)and(j-c[l,2]>zfx) then
zfx:=min(c[l,1],j-c[l,2]);
end;
end;
begin
readln(n,m);
for i:=1
to n do
begin
for j:=1
to m do
begin
read(a[i,j]);
if (i=1)or(a[i,j]=a[i-1,j]) then
begin
b[i,j]:=1;
endelse
begin
b[i,j]:=b[i-1,j]+1;
end;
end;
readln;
end;
for i:=1
to n do
begin
l:=1;
c[1,1]:=b[i,1];
c[1,2]:=1;
for j:=2
to m do
begin
if a[i,j]<>a[i,j-1] then
begin
while c[l,1]>b[i,j] do
begin
chuli(l,l,j);
if c[l-1,1]then
begin
c[l,1]:=b[i,j];
break;
endelse
begin
dec(l);
end;
end;
if c[l,1]then
begin
inc(l);
c[l,1]:=b[i,j];
c[l,2]:=j;
end;
endelse
begin
chuli(1,l,j);
l:=1;
c[l,1]:=b[i,j];
c[l,2]:=j;
end;
end;
j:=m+1;
chuli(1,l,j);
end;
writeln(zfx*zfx);
writeln(cfx);
end.
這道題剛做的時候覺得比佇列簡單可是,做了才知道不好處理(佇列要控制兩個指標,而棧就控制乙個),最應該注意的是出棧時的處理,分為兩中出棧一種是全出,另一種是a[n]到a[n-1],a[n]到a[n-2],a[n]到a[n-3].......a[n]到a[1],
最後還要考慮到全出棧的情況。 單調棧 模板 單調棧模板
biu 單調棧主要用於求取左邊第乙個比它大,或者比它小的數。就比如站隊隨便排成一列,可以求到每個人後面第乙個比他高的人。同理可以推廣至右邊,比它矮均可。這就是單調遞增棧 遞減棧,從前至 棧,從後向前入棧的區別了。單調棧比較抽象,非常具有智慧型的想法,可應用的場景相當少,根據幾個經典題目體會它的用法會...
單調佇列 單調棧
參考文章 單調佇列 poj 2823 給定乙個數列,從左至右輸出每個長度為m的數列段內的最小數和最大數。數列長度 n 106 m n n 106,m n n 106 m n 直接暴力求解複雜度在0 mn 可以考慮維護區間最值,單調佇列則是維護區間佇列的強大 單調佇列的定義 單調佇列實現的大致過程 1...
棋盤製作 題解
題目描述 西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋 象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8 8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是他跟他的好朋友小w...