luoguP2184 貪婪大陸 題解 樹狀陣列

2022-01-30 13:32:50 字數 1331 閱讀 4290

p2184 貪婪大陸  題目

其實很容易理解就是詢問一段區間內有多少段不同的區間

然後再仔細思索一下會發現:

1.只要乙個區間的開頭在乙個節點i的左邊,那麼這個區間包含在區間1~i中。

2.只要乙個區間的尾部在乙個節點j的左邊,那麼這個區間肯定不屬於j之後的所有區間

這時候就不難想到用兩個樹狀陣列維護:

第乙個:維護節點i之前有多少個區間的開頭

第二個:維護節點j之前有多少個區間的結尾

不難證明拿sum[i]-sum[j]得到的就是i~j中間地雷的個數(手動模擬一波就一清二楚了)

#include#include

#include

#include

#include

#include

#include

#include

#include

#define lst long long

#define rg register

#define n 100050

using

namespace

std;

intn,m;

lst ans;

int tou[n],wei[n];//

tou存前面有多少個區間的開始,以下簡稱頭部樹狀陣列

//wei存前面有多少個區間的尾部,以下簡稱尾部樹狀陣列

//類似於字首和

inline int read()//

讀入優化

//以下是樹狀陣列的板子

inline int lowbit(rg int kk)//

lowbit

inline

void add_tou(rg int kk)//

加入樹狀陣列的頭部陣列

}inline

void add_wei(rg int kk)//

加入樹狀陣列的尾部陣列

}inline

int sum_tou(rg int kk)//

計算節點前有多少個區間的開始

return

s; }

inline

int sum_wei(rg int kk)//

計算節點前有多少個區間的結束

return

s; }

intmain()

else

}return0;

}

通過這道題,我們可以發現大部分的樹狀陣列題目可以用線段樹做,但也有線段樹不好維護的題目,這就需要靈活的利用樹狀陣列的技巧(雖然題解裡也有線段樹比較好理解的) 我自認為我的**還是蠻好看的,只是變數有點醜,但好理解

luogu P2184 貪婪大陸

題目傳送門 233333 本題由萌萌噠的我的同桌推薦 woc為毛bzoj自爆了 詢問區間 l,r 就是求出l點此時的地雷數 l 1,r 中新加的地雷數 l點地雷數 1,l 的左端點數減去 1,l 1 的右端點數 l 1,r 中新加的地雷數 l 1,r 的左端點數 所以詢問 l,r 就是 1,r 的左...

luoguP2184 貪婪大陸

當詢問區間 l,r 中地雷種類數時,我們只需要用 r 前面的區間開頭數量減去 l 前面的區間結尾數量即可.原因很簡單.對於詢問區間 l,r 我們要求它與先前埋下的地雷區間有交的區間數量,所以只要區間 l,r 的 l去掉不合法的 r即滿足要求.所以這個題我們可以使用兩個樹狀陣列來解決.tree 0 維...

luogu P2184 貪婪大陸

嘟嘟嘟 這真是一道好題啊 看起來覺得似曾相識,但就是想不出來區間怎麼合併,最後還是聽lbg巨佬講的 高能演算法 連線段樹都不用,樹狀陣列就行了。對於修改區間 l,r 分別用樹狀陣列cl,cr維護l和r的字首和。統計的時候就是cl r cr l 1 理解起來就是先找出所有在r之前被修改的區間,然後在減...