時間分治(線段樹分治)

2021-09-17 02:35:05 字數 1426 閱讀 3465

對於一類有插入、刪除(撤銷插入)和整體查詢操作的題目,可以考慮按時間分治(也可以叫線段樹分治),就是對於每乙個插入操作處理出它存在的時間,那麼就不用管刪除操作了,再將這些插入操作存在區間建立一棵時間線段樹,每個節點是乙個vector,然後從線段樹dfs到葉子經過的點上所有點vector的並就是在這個點時會對其產生影響的所有操作了。而一般這類題不會真的要把所有vector傳到葉子,可能是線性基之類的東西往下傳......

例題:t1 bzoj4184 shallot

基本是模板了......

**:

#include#define pii pair#define fi first

#define sc second

#define pb(x) push_back(x)

using namespace std;

const int n=5e5+100;

const int mxa=1<<30;

void rd(int &x)

int n,a[n],ans[n];

struct xxj

int& operator(int x)

void ins(int x)

x^=a[i];

}} }

int calc() };

int fr_n,to_n;

pii fr[n],to[n];

vectorseg[n<<2];

void ins_seg(int l,int r,int l,int r,int k,int w)

}void dfs_seg(int l,int r,int k,xxj res)

}int main()

sort(fr+1,fr+fr_n+1),sort(to+1,to+to_n+1);

int to_ps=0;

for(int i=1;i<=fr_n;i++)

struct xxj;

void ins(bst x)

x^=a[i];

} }void print()

bool ***=0;

for(int i=m-1;i>=0;i--)

***?puts(""):puts("0");

}};bst bf[n];

int n,m,las[n];

char s[m];

vectorseg[m<<2];

void ins_seg(int l,int r,int l,int r,int k,bst x)

}void dfs_seg(int l,int r,int k,xxj res)

}int main()

for(int i=1;i<=n;i++)

ins_seg(las[i],m,1,m,1,bf[i]);

dfs_seg(1,m,1,xxj());

}

線段樹分治

動態圖聯通性 可離線 loj121 給你一張無向圖,你要支援如下操作 1 刪除一條邊 2 加入一條邊 3 查詢某兩個點對間是否聯通 離線做法 線段樹分治 口胡做法 把操作的順序當做時間。每條邊維護乙個存活區間,代表這條邊在這個時間區間裡面活著。對時間軸建立一顆線段樹,從線段樹根開始dfs。進入乙個子...

線段樹分治

首先,這裡的線段樹是狹義的線段樹。而線段樹分治是一種維護時間區間的資料結構,利用線段樹的分治性使時間複雜度為log loglo g級別。維護時間區間的資料結構有cdq分治 kd tree,那麼線段樹分治和它們的區別在 呢?其實,它就是用回退操作來實現可持久化,或者說是維護了操作會影響的時間區間。我們...

線段樹分治

day2模擬被完爆了w 來學一波線段樹分治 原來一直拿它口胡其實沒寫過。然鵝這個東西和線段樹的關係 就像點分治和點分樹一樣 並不用建出來 但遍歷順序是一致的 從上到下 從左兒子到右兒子 訪問 線段樹 的所有節點 每個節點表示乙個區間 當然維護的也是區間裡的值 這就要求我們維護的東西滿足區間加法 比如...