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}\)
\(n\le 10^5\)。
\(\text{Solution}\)
真的啥也不會。
首先這個資料範圍就應該意識到不是將空白行/列看成點就是用 \(m\) 個障礙來做。
這裡是用空白行/列(我們定義空白行/列為連續無障礙的區間)。可以計算一下這個的空間複雜度:對於空白行,如果沒有障礙就是 \(n\) 條,發現多一個障礙就會多劃分出一個空白行,空白列同理。空間複雜度大約 \(n+m\)。
如何維護 "轉向" 的操作?考慮如果有兩個相交的空白行和空白列,就在它們之間連一條邊權值為 \(1\)。
設 \(dis_u\) 為 \((1,1)\) 所在的空白列到 \(u\)
如何建圖?考慮用掃描線 + 線段樹維護每一行對應的空白列,再對於此行的空白行 \((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}\)
咕咕咕