[Codeforces is All You Need] ER 145 E (1809E) - Explanation
????????閱讀jiangly代碼有感,覺(jué)得思路很有趣,具體代碼各位可自行去codeforces欣賞。這里我不會(huì)給出詳細(xì)的證明,僅作直觀解釋。
題目簡(jiǎn)述
????????有兩個(gè)容量分別為的桶。給定一個(gè)長(zhǎng)為
的按順序進(jìn)行的操作序列,每個(gè)元素表示從一號(hào)桶向二號(hào)或者從二號(hào)桶向一號(hào)桶倒指定水量
。當(dāng)然,操作需要符合常理,因此實(shí)際轉(zhuǎn)移的水量為
,其中
表示目標(biāo)桶的剩余可接納量,
表示源桶的剩余水量。對(duì)于
,計(jì)算當(dāng)初始水量為
時(shí)最終的水量。
????????原題目鏈接為:https://codeforces.com/contest/1809/problem/E
解釋
????????將一號(hào)桶的水量看作狀態(tài)。在總水量一定的前提下,一號(hào)桶的水量一定位于
之間,可視化為:

????????整個(gè)完整的轉(zhuǎn)移序列對(duì)應(yīng)著在上下界之間“回蕩”的折線,如下:

????????考慮從左到右(藍(lán)色線之間)以及從右到左(橙色線之間)所有轉(zhuǎn)移的情況,分別可以劃定出不同的折線帶:

????????觀察圖中的橙色帶和藍(lán)色帶的交集(黃色部分)。這一部分不會(huì)受到上下界的限制。而對(duì)于交集帶之外的任意路徑,最終一定收束于交集帶的對(duì)應(yīng)邊界(紅線和紫線):

????????因此,只需要對(duì)全值域進(jìn)行一次逆向映射求得定義域處交集帶的范圍,并基于這個(gè)范圍正向映射求得對(duì)應(yīng)的值域,即可判斷任意初態(tài)最終的落點(diǎn)。