1. 程式人生 > 實用技巧 >尋找車位[Code+#3]

尋找車位[Code+#3]

題目描述

access_globe 有一個巨大的停車場,這個停車場有 \(N\) 行,每行有 \(M\) 個車位。為了美觀,access_globe 在建立這個停車場時,規定這個停車場必須是長條形的,即 \(N\ge M\) 。每個車位都是一個正方形的區域。

最近,access_globe 正在為抽不到 Missing Poster 而苦惱,因此他請你幫他維護這個停車場。你需要支援兩個事件:

  • 一輛車停到某一個車位中,或一輛車從某個車位開走
  • 查詢一個矩形區域內最大的只包含空車位的正方形區域

如果你能幫 access_globe 高效地解決這個問題,access_globe 一定會好好獎勵你的。

\(N \times M \le 4*10^6,Q\le 2000\)

題解

線段樹神題

\(N\) 這一維開一棵線段樹,然後線段樹上的每個節點維護3個數組:lm[M], rm[M], val[M]

假設線段樹的某個節點表示的是 \([l,r]\) 這段區間 (\(1\le l\le r\le N\)) ,那麼這個節點的 lm[i] 表示第 \(i\) 列中,從第 \(l\) 個車位開始往後數有多少個連續的 \(1\)rm[i] 表示從第 \(r\) 個車位往前數有多少個連續的 \(1\)

這個節點的 val[i] 表示如果以第 \(i\) 列作為正方形的右邊界,且正方形的上下邊界在 \([l,r]\)

內,全1的正方形的邊長最大是多少

lm[M]rm[M] 都很容易通過左右兒子的值求出來,如何求出 val[M] ?