題意
lantian有一個美麗的大花園,因爲他喜歡在黃昏後欣賞花園的美麗,他在花園中安裝了許多盞燈。
這些燈是有方向的,它們只會朝一個確定的夾角內發光。而且,lantian把它們安放的很整齊,所以它們都朝向同一個方向。
這些燈都是太陽能燈,它們使用的是太陽能而不是電能。第 $ i $ 盞燈會發光當且僅當至少 $ k_i $ 盞燈照到了它或者它通了電。
現在,lantian將按 $ 1 $ 到 $ n $ 的順序給每盞燈通電,即在第 $ i $ 個時刻給第 $ i $ 盞燈通電。最後,lantian想知道每盞燈從哪一個時刻開始發光,請寫一個程序回答這個問題。
題解
首先那個夾角的範圍直接看不好做,考慮轉化爲直角座標系。即以所給的兩條射線的方向向量爲基底,每個點用它們表示爲直角座標系的座標。注意到兩條射線共線時會有問題,把其中一條偏轉一下,變爲一個極小的夾角即可。
於是問題轉化爲直角座標系上的個點,第個點在時刻i被點亮,如果它的左下角有不少於個點被點亮時它也被點亮,求每個點第一次被點亮的時間。
由於這個過程是動態的,即一個點被點亮時會影響它右上的點,被點亮的又會繼續去影響,且每個點的不同,直接做不好找到哪些點有影響,不好維護。而我們關心的又是時間,如果我們能知道在一個時間前被點亮的點有影響,那麼直接考慮編號小於這個時間的點的影響,並在該過程中把這個時間內被點亮的點的影響加入,就可以把所有點被點亮的時間分爲前後兩部分。
於是考慮整體二分,記當前內的點在時間內被點亮,按照爲第一關鍵字,爲第二關鍵字排序,用以爲關鍵字的樹狀數組維護找出每個點右下角的點數,即可找出之前被點亮的點,遞歸下去做即可。