DTOJ 2899. Solar lamps(lamp)

題意

lantian有一個美麗的大花園,因爲他喜歡在黃昏後欣賞花園的美麗,他在花園中安裝了許多盞燈。

這些燈是有方向的,它們只會朝一個確定的夾角內發光。而且,lantian把它們安放的很整齊,所以它們都朝向同一個方向。

這些燈都是太陽能燈,它們使用的是太陽能而不是電能。第 $ i $ 盞燈會發光當且僅當至少 $ k_i $ 盞燈照到了它或者它通了電。

現在,lantian將按 $ 1 $ $ n $ 的順序給每盞燈通電即在第 $ i $ 個時刻給第 $ i $ 盞燈通電。最後,lantian想知道每盞燈從哪一個時刻開始發光,請寫一個程序回答這個問題。

題解

首先那個夾角的範圍直接看不好做,考慮轉化爲直角座標系。即以所給的兩條射線的方向向量爲基底,每個點用它們表示爲直角座標系的座標。注意到兩條射線共線時會有問題,把其中一條偏轉一下,變爲一個極小的夾角即可。

於是問題轉化爲直角座標系上的nn個點,第ii個點在時刻i被點亮,如果它的左下角有不少於kik_i個點被點亮時它也被點亮,求每個點第一次被點亮的時間。

由於這個過程是動態的,即一個點被點亮時會影響它右上的點,被點亮的又會繼續去影響,且每個點的kik_i不同,直接做不好找到哪些點有影響,不好維護。而我們關心的又是時間,如果我們能知道在一個時間前被點亮的點有影響,那麼直接考慮編號小於這個時間的點的影響,並在該過程中把這個時間內被點亮的點的影響加入,就可以把所有點被點亮的時間分爲前後兩部分。

於是考慮整體二分,記當前[a,b][a,b]內的點在時間[l,r][l,r]內被點亮,按照xx爲第一關鍵字,yy爲第二關鍵字排序,用以yy爲關鍵字的樹狀數組維護找出每個點右下角的點數,即可找出midmid之前被點亮的點,遞歸下去做即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章