對於一類有插入、刪除(撤銷插入)和整體查詢操作的題目,可以考慮按時間分治(也可以叫線段樹分治),就是對於每乙個插入操作處理出它存在的時間,那麼就不用管刪除操作了,再將這些插入操作存在區間建立一棵時間線段樹,每個節點是乙個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 來學一波線段樹分治 原來一直拿它口胡其實沒寫過。然鵝這個東西和線段樹的關係 就像點分治和點分樹一樣 並不用建出來 但遍歷順序是一致的 從上到下 從左兒子到右兒子 訪問 線段樹 的所有節點 每個節點表示乙個區間 當然維護的也是區間裡的值 這就要求我們維護的東西滿足區間加法 比如...