第一百零一篇博文了喲~
比賽的時候直接看D和E了,結果都沒做出來,我這個大水貨。
A題 : 水題,滿足整除其實就是餘數為0
B提 : 類比題
C題 : 逆著恢複原來的數列就好了(不斷的減一),直到碰到0就停止,當然不能類比
D題 : 給你一棵黑白樹的每個點的顏色,以及這個點周圍所有邊的權值和,讓你還原這棵樹。
將白點和黑點排成兩排,按照權值從小到大,每次都從端點建邊,邊的權值為兩個點權值(題目給的權值)的最小值,然後可知有一個點還有權值剩餘,繼續從這個點出發向另一排點的下一個點連邊,這樣子到最後肯定能構造出一棵滿足條件的樹來。因為
1 : 每次連邊都是在兩排點的端點,不會產生交叉邊,有環的前提是有交叉邊,到最後肯定能連n-1條邊,然後又是無環的,肯定是棵樹嘍
2 :白點的權值和與黑點的權值和是相等的,而每次連邊,雙方都會減少相同的權值,最後一次連邊肯定會消耗相同的權值,因為前面都是一樣的
E題:給你10W個點,在給你9個數,問你能否用兩條橫線和兩條豎線將這10w個點分成九塊,每一塊的點數會對應這九個數的某個排列,如果能,輸出這四條線
顯然,可以暴力枚舉排列,然後驗證是否可行,考慮到不用每一塊都去驗證,可以先快速判斷一下三行三列的數目是否合法,這個將x和y分別處理出來就可以在O(1)時間做到,然後這樣子如果還是合法,就需要驗證每個小塊是否合法,也不用求九個,只要左下角的四個就可以了,問題轉換為了求一個矩形地區內點的個數,比賽的時候想到用線段樹,但是一直想不到怎麼求一個區間內(下標)有多少個點的y值是小於等於一個值的,以前好像聽說過這種好幾維的東東可以用樹套樹來做,不過一直拖著沒去做過,可能這道題要實現的操作比較簡單,只要求某一維小於等於一個數的點有幾個就可以(可以二分求),所以可以用一棵線段樹搞定,不過線段樹的每個節點必須要記錄該節點表示的區間內的所有的y值,並排好序,所以這樣子的話預先處理的複雜度就是n
logn logn 空間複雜度為n logn ,總的時間複雜度是,(nlogn*logn + 9! * logn * logn ) 可能由於前面的三行三列的判斷是很有效吧,代碼的速度還挺快的
戳這裡看代碼