Tyvj1939 玉蟾宮(單調棧)

2022-03-01 11:16:34 字數 1684 閱讀 6524

傳送門

description

有一天,小貓rainbow和freda來到了湘西張家界的天門山玉蟾宮,玉蟾宮宮主藍兔盛情地款待了它們,並賜予它們一片土地。

這片土地被分成n*m個格仔,每個格仔裡寫著』r』或者』f』,r代表這塊土地被賜予了rainbow,f代表這塊土地被賜予了freda。

現在freda要在這裡賣萌。。。它要找一塊矩形土地,要求這片土地都標著』f』並且面積最大。

但是rainbow和freda的oi水平都弱爆了,找不出這塊土地,而藍兔也想看freda賣萌(她顯然是不會程式設計的……),所以它們決定,如果你找到的土地面積為s,它們每人給你s兩銀子。

input

第一行兩個整數n,m,表示矩形土地有n行m列。

接下來n行,每行m個用空格隔開的字元』f』或』r』,描述了矩形土地。

output

輸出乙個整數,表示你能得到多少銀子,即(3*最大』f』矩形土地面積)的值。

sample input

5 6r f f f f f

f f f f f f

r r r f f f

f f f f f f

f f f f f f

sample output

45hint

對於50%的資料,1<=n,m<=200

對於100%的資料,1<=n,m<=1000

好像沒有許可權號提交不了這題,不過和黃學長對拍過,應該沒什麼問題吧。

n3 肯定是不行的。

可以 n2 預處理出來每個點上面的 f 的高度,這樣這張圖的每一行就變成了直方圖。

目的就是掃瞄每一行的直方圖,然後計算直方圖中的最大矩陣。

求直方圖的最大矩陣可以用單調棧優化,l[i] 表示在 i 左邊比 i 小的第乙個,r[i] 表示在 i 右邊比 i 小的第乙個。

l 和 r 陣列可以從後往前和從前往後掃兩邊求出來。

最後 ans = max(ans, (r[i] - l[i] - 1) * h[i]) 求出 (h[i] 為高度)

1 #include 2 #include 3

4using

namespace

std;56

const

int maxn = 1001;7

intn, m, ans, top;

8int

a[maxn][maxn], s[maxn], l[maxn], r[maxn];

910 inline void work(int

h)11

20 top = 0;21

for(i = m; i >= 0; i--)

2226

for(i = 1; i <= m; i++) ans = max(ans, (r[i] - l[i] - 1) *h[i]);27}

2829

intmain()

3039

for(int i = 1; i <= n; i++) work(a[i]);

40 printf("

%d", ans * 3

);41

return0;

42 }

view code

單調棧 城市遊戲(玉蟾宮)

給你 n times m 個格仔,每個格仔上有 r 或 f 現在要找一塊矩形土地,使這片土地都標有 f 且面積最大,讓你求出這個最大面積並 times3 輸出 面積最大,且為矩形,爆搜可以考慮一下,但爆搜肯定是超時的 話說有些題庫 n 3 竟然能過?在爆搜的時候我們能得到的乙個資訊就是,如果以某一高...

單調棧 Poetize4 玉蟾宮

背景 background 有一天,小貓rainbow和freda來到了湘西張家界的天門山玉蟾宮,玉蟾宮宮主藍兔盛情地款待了它們,並賜予它們一片土地。描述 description 這片土地被分成n m個格仔,每個格仔裡寫著 r 或者 f r代表這塊土地被賜予了rainbow,f代表這塊土地被賜予了f...

P4147 玉蟾宮 單調棧

有一天,小貓rainbow和freda來到了湘西張家界的天門山玉蟾宮,玉蟾宮宮主藍兔盛情地款待了它們,並賜予它們一片土地。這片土地被分成n m個格仔,每個格仔裡寫著 r 或者 f r代表這塊土地被賜予了rainbow,f代表這塊土地被賜予了freda。現在freda要在這裡賣萌。它要找一塊矩形土地,...