CF815D Karen and Cards 官方題解翻譯

  看到這道題,網上沒有中文版的官方題解,因而就本身翻譯了一遍。編程

  不是機器翻譯,是一個字一個字純手翻譯的,若是有錯誤歡迎指正。數組

  

  好比咱們有一張卡片,三個參數分別是 a1 = 4, b1 = 2, c1 = 3. 方便起見,咱們令 p = q = r = 5.ui

  考慮什麼樣的卡片可以擊敗這張. 咱們能夠固定一個參數c,來觀察對於不一樣的c,有什麼特殊的性質:spa

 

  注意在第c個座標系中,座標爲(a,b)的綠色方格表明一張卡片 (a, b, c) 能夠擊敗咱們這張卡片 (4, 2, 3). 所以,對於全部c個座標系中的綠色方格總數就是能擊敗這張卡片卡片總數。這種表示方法很重要, 由於咱們能夠簡單地考慮更多的卡片.好比咱們有這樣一張卡片 a2 = 2, b2 = 3, c2 = 4:翻譯

 

  如今,考慮咱們想同時擊敗這兩張卡片時是什麼狀況?顯然,咱們只須要把對應的兩個座標系求交集便可。指針

 

 

  記住,咱們只須要算得每一個座標系中的綠色方格數量。blog

  事實證實,咱們很難直接計算出綠色方格的數量。相反,計算非綠色的方格數量是更加可行的,這時咱們只須要將其從全部pqr座標系中減去便可。排序

  怎麼作?咱們要利用這些網格的一些優美的性質。ci

  首先,對於每一個特定的卡片(ai, bi, ci),全部的 1 到 ci 座標系是相同的, 而且全部的 ci + 1 到 r 的座標系也是相同的。這就是說咱們能夠避免大量冗餘計算,並且僅當狀態變化時咱們才須要進行更新。class

  其次,若是一個方格(a, b)對於一個固定的c不是綠色的, 那麼對於相同的c,知足a' ≤ a, b' ≤ b的全部方格(a', b') 也不是綠色的。這就意味着咱們能夠用一個數組u1, u2, u3, ...代替c相同的座標系,其中ua表示全部非綠的(a, b)中最大的b. 另外, u1 ≥ u2 ≥ u3 ≥ ... ≥ up.

  再其次,對於每張卡片,每個特定的c,u數組中最多隻有兩種不一樣的取值

  最後,對於每張卡片,當c<c’時,c座標系的u數組中任何一個值ui都不小於c’ 座標系的u’數組中的對應取值u’i。

  儘管這些性質都是顯而易見容易證實的, 但會成爲咱們解決問題的良方。

  咱們從c = r 到 c = 1枚舉c. 假設咱們維護一個初始全零的數組s. 將用來保存對於每一個c的非綠方格總數。

  咱們首先對於每一個座標系進行更新. 對於每張卡片, 每一個isi 取max(si, ui)。

  固然,對於每一個座標系求出答案須要O(np)的時間複雜度, 這太慢了。 解決這個問題,咱們能夠把s數組建成線段樹。如今,對於每個卡片i,咱們只須要將s1, s2, s3, ..., sai 設置爲max(sj, bi) 。

  由於s數組其實是一組u的最大值,這些是不被其餘性質所增長的,因此s數組一直是不增長的。因此這些更新很容易作; 咱們把sk, sk + 1, sk + 2, ..., sai 設置爲bik是最小的知足bi ≥ sk的數。咱們能夠二分找到k, 線段樹上二分能夠作到O(log p)的複雜度。O(log^2 p)的複雜度可能經過這道題有些困難。

  執行上述操做,咱們就能在O(nlog p)的時間複雜度以內生成c=r時的相應s數組。使用線段樹咱們就可以隨時統計s數組總和,這就能容許咱們統計全部非綠色格子的數量。

  如今咱們將從c=r向c=1枚舉c,並觀察那個網格發生了變化(開始的時候對卡片按照c參數排序,以後雙指針掃描就能夠了) 全部座標系網格均可以按照以前的方法更新。當座標系發生變化時,好在咱們有第四條性質,保證ui不會減小,只會變得更大。因此,咱們只能更新兩個範圍:將s1, s2, s3, ..., sai 更新爲 r 以及sai + 1, sa2 + 1, sai + 3, ..., sp 更新爲 max(sj, bi). 前者更新頗爲簡單, 後者就須要像以前同樣用二分查找完成.

  當咱們更新完每個特定的c表示的座標系時,獲得了這個範圍的權值和,而後再倒着枚舉c,這樣直到咱們枚舉到1。咱們將在每一個c座標系中找到非綠色方格的總數,從中咱們就能夠得出綠色的方格總數,這樣就能夠獲得答案。

  對卡片排序花費 O(nlogn)的時間複雜度, 建出線段樹s花費O(p) 的時間複雜度,而且有O(n)個更新操做每一個花費O(log p)的時間複雜度,枚舉花費O(r)的時間複雜度。所以最終的運行時間複雜度是O(n(log n + log p)+p+r) ,這樣的複雜度足以經過此題。

  題解也能夠修改一下能夠經過 p, q, r ≤ 10^9的數據;但是,並無出現這樣的要求,由於思想都是同樣的,只不過增長了很多編程複雜度,若是有意,能夠自行實現一下。

相關文章
相關標籤/搜索