尋找車位[Code+#3]
阿新 • • 發佈:2020-11-28
題目描述
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]\)
lm[M]
和 rm[M]
都很容易通過左右兒子的值求出來,如何求出 val[M]
?