1. 程式人生 > >【總結】偏序/數點

【總結】偏序/數點

說過 適合 聽說 貢獻 amp clas 。。 inline line

這是一篇關於偏序/數點的總結

偏序是個什麽東西?

我不知道準確的定義
但大概是以下例子表達出來的意思
一維偏序:一堆一維點,對於每個 \(i\) 求滿足 \(point[j].x<=point[i].x\)\(j\) 的個數
二維偏序:一堆二維點,對於每個 \(i\) 求滿足 \(point[j].x<=point[i].x\ \&\&\ point[j].y<=point[i].y\)\(j\) 的個數
三維偏序:一堆三維點,對於每個 \(i\) 求滿足 \(point[j].x<=point[i].x\ \&\&\ point[j].y<=point[i].y\ \&\&\ point[j].z<=point[i].z\)

\(j\) 的個數
……
大概知道了吧

什麽時候用?

  1. 裸題就不用說了
  2. 然後,有些時候代碼中出現了類似偏序的式子(就是上面一堆小於等於的式子)的計數,就可以把這個計數的任務交給偏序去做
  3. 發揮人類智慧的題目

做法

這裏給出三維以內的偏序大概做法,但因為這個東西還是比較偏的,所以不太詳細,也都只給出了一種做法(其實每一種都有很多做法,最好是能找到最好理解的最適合自己的方法)

  • 一維偏序
    這。。。BIT直接維護(類似於求逆序對。這不就是個求順序對?)
  • 二維偏序
    我們先按照第一關鍵字排序,這樣排序後我們就保證了後面的點的第一關鍵字一定大於等於前面的點的第一關鍵字,然後第二維也用BIT維護就行了
  • 三維偏序
    CDQ分治+BIT
    對於CDQ分治,我無能為力,不知道的百度吧(以前學姐發明的東東,我之前居然沒聽說過。。)
    先按照第一關鍵字排序,然後CDQ分治。對於每一層,我們已經保證了第一關鍵字的大小順序,那麽我們就把前半部分(為什麽是前半部分?我們在分治啊!)的標記成能夠修改BIT,也就是能對後半部分加貢獻的,然後後面一半標記成只能接受貢獻的。然後再把這一塊按照第二關鍵字排序,這樣我們既有之前的標記保證了第一關鍵字的順序,又有之後的排序保證了第二關鍵字的排序,所以對於第三關鍵字,又可以用BIT了

還有四維,五維……無所謂,CDQ分治可以嵌套
最後有一道三維偏序的模板題,【刷題】BZOJ 3262 陌上花開

【總結】偏序/數點