單調棧 棋盤製作

2021-06-29 12:49:58 字數 1805 閱讀 4116

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...