1. 程式人生 > 其它 >Grid With Mirrors 又名“月黑風高,鴨在捉鵝”

Grid With Mirrors 又名“月黑風高,鴨在捉鵝”

今天翻了翻草稿箱,發現自己不知不覺已經咕了很多篇部落格了... 目錄

\(\text{Description}\)

洋文

中文

\(\mathtt{kxy}\) 又微醺啦!醉鵝從座標為 \((1,1)\) 的酒吧出來,在 \(n\times n\) 的大街上亂跑!注意\(\mathtt{kxy}\) 初始時是向右跑的!

大街上充滿了危險,有 \(m\) 個位置存在 \(\mathtt{lt}\)(別問我為什麼 \(\mathtt{lt}\) 多達 \(10^5\) 個),如果 \(\mathtt{kxy}\) 跑到這種位置就會觸發 \(\mathtt{lt}\)

!醉鵝雖然醉了,但是隻聰明鵝,不會跑入這種位置。

鵝跑是因為鴨捉,鴨捉是因為鵝跑。

\(\mathtt{qbt}\) 自覺跑不過醉鵝,心生一計,決定在原地守株待鵝。她會在某些方格放一瓶 "勇闖天涯",當醉鵝到達此方格就會轉向(當然我們的 \(\mathtt{qbt}\) 是隻聰明鴨,醉鵝轉的方向由 \(\mathtt{qbt}\) 決定)。她會在所有的方格實施這個計劃,不過經費有限,你需要算出 \(\text{Ans}=\sum f(x,y)\),其中 \(f(x,y)\)\(\mathtt{qbt}\) 在方格 \((x,y)\) 時使 \(\mathtt{kxy}\) 跑入自己懷裡的最少 "勇闖天涯" 數。需要注意的是,如果 \(\mathtt{kxy}\)

無論如何跑不到此方格,\(f(x,y)=0\)

\(n\le 10^5\)

\(\text{Solution}\)

真的啥也不會。

首先這個資料範圍就應該意識到不是將空白行/列看成點就是用 \(m\) 個障礙來做。

這裡是用空白行/列(我們定義空白行/列為連續無障礙的區間)。可以計算一下這個的空間複雜度:對於空白行,如果沒有障礙就是 \(n\) 條,發現多一個障礙就會多劃分出一個空白行,空白列同理。空間複雜度大約 \(n+m\)

如何維護 "轉向" 的操作?考慮如果有兩個相交的空白行和空白列,就在它們之間連一條邊權值為 \(1\)

\(dis_u\)\((1,1)\) 所在的空白列到 \(u\)

(這是空白列/行的編號)的最短距離,\(r(x,y),c(x,y)\) 分別是 \((x,y)\) 所在的空白行/列編號。那麼有:

\[f(x,y)=\min\{dis_{r(x,y)},dis_{c(x,y)}\} \]

如何建圖?考慮用掃描線 + 線段樹維護每一行對應的空白列,再對於此行的空白行 \((l,r)\),將它與線段樹上的區間 \([l,r]\) 連邊。由於需要儲存之前的連邊情況,所以需要開成主席樹。

求出 \(dis\) 後顯然不能直接算貢獻。這個 \(\min\) 十分難搞,考慮轉化成加減運算。由於只有行和列連邊,整張圖應該是一張二分圖,而且由於 \(\mathtt{kxy}\) 初始時是向右跑的,我們只有一個起點。所以實際上 \(dis_{r(x,y)},dis_{c(x,y)}\) 只會相差 \(1\)!那麼有

\[f(x,y)=\frac{\left(dis_{r(x,y)}+dis_{c(x,y)}-1\right)}{2} \]

因為是整除,所以可以先算分子的和再除以 \(2\)。對於空白行,它的貢獻就是 \(dis\cdot len\),其中 \(len\) 是它的長度。

\(\text{Code}\)

咕咕咕