資料結構 主席樹

2022-06-23 01:15:21 字數 3557 閱讀 2542

1.p3919 【模板】可持久化線段樹 1(可持久化陣列)

#include #define mkp make_pair

#define pb push_back

#define v(t) vector#define all(x) x.bg,x.ed

#define newline puts("")

#define si(x) ((int)x.size())

#define rep(i,n) for(int i=1;i<=n;++i)

#define rrep(i,n) for(int i=0;ipii;

const int maxn = 1e6+10;

const int inf = 0x7f7f7f7f;

const ll inf_ll = 1ll*inf*inf;

const int mod = 1e9+7;

const double eps = 1e-7;

int t[maxn<<5];//儲存歷史版本

int tree[maxn<<5],lc[maxn<<5],rc[maxn<<5];

int n,q;

int a[maxn];

int tot = 0;

int build(int l,int r)

int m=(l+r)>>1;

lc[rt]=build(l,m);

rc[rt]=build(m+1,r);

return rt;

}int update(int pre,int x,int val,int l,int r)

lc[rt]=lc[pre],rc[rt]=rc[pre];

int m=(l+r)>>1;

if(x<=m) lc[rt]=update(lc[pre],x,val,l,m);

else rc[rt]=update(rc[pre],x,val,m+1,r);

return rt;

}int query(int pre,int x,int l,int r)

int m=(l+r)>>1;

if(x<=m) return query(lc[pre],x,l,m);

else return query(rc[pre],x,m+1,r);

}int main()

t[0]=build(1,n);

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

else if(op == 2)

}return 0;

}

2.p3834 【模板】可持久化線段樹 2(主席樹)

#include #define mkp make_pair

#define pb push_back

#define v(t) vector#define all(x) x.bg,x.ed

#define newline puts("")

#define si(x) ((int)x.size())

#define rep(i,n) for(int i=1;i<=n;++i)

#define rrep(i,n) for(int i=0;ipii;

const int maxn = 2e5+10;

const int inf = 0x7f7f7f7f;

const ll inf_ll = 1ll*inf*inf;

const int mod = 1e9+7;

const double eps = 1e-7;

int n,m;

ll tree[maxn<<5],lc[maxn<<5],rc[maxn<<5];

ll t[maxn];

ll tot = 0;//當前節點編號

ll a[maxn],b[maxn];//a原陣列,b離散化陣列

主席樹+樹上差分

#include using namespace std;

typedef pairpii;

typedef long long ll;

const int maxn = 1e5+10;

int n,m;

int a[maxn],b[maxn];

vectorg[maxn];

int fa[maxn][35];

int dep[maxn];

int tot;//離散化

void dfs(int u,int f)

}return fa[u][0];

}int id[maxn],cnt = 0;

int num[maxn<<5],lc[maxn<<5],rc[maxn<<5];

void pushup(int p)

int update(int pre,int l,int r,int pos,int val)

int m = (l+r)>>1;

if(pos <= m) lc[p]=update(lc[pre],l,m,pos,val);

else rc[p]=update(rc[pre],m+1,r,pos,val);

pushup(p);

return p;

}int query(int aa,int bb,int cc,int dd,int l,int r,int k)

void dfs2(int u,int f)

}int main()

sort(b+1,b+n+1);

tot = unique(b+1,b+n+1)-b-1;

for (int i=1;i

主席樹 資料結構的克星

1.主席樹 又叫可持續化線段是,因為每次對主席樹的修改,都會重新建立一棵新的數,保留這沒修改之前的歷史紀錄,所以叫可持久化線段樹,她是以線段樹為基礎建立的多棵樹,每棵樹代表著乙個歷史階段,它與線段樹的儲存結構稍微有點不同,就是線段是的左右兩個孩子與根節點都存在這x2,x2 1的關係,而主席樹的根節點...

可持久化資料結構之靜態主席樹

參考部落格 前言 如果完全掌握了主席樹的前置知識,主席樹其實也是一種並不算很難的資料結構 雖然蒟蒻還是花了好久 主席樹主要的前置知識就是權值線段樹,一旦理解了權值線段樹的相關知識,那麼主席樹的學習應該也會變得較為簡單。權值線段樹是線段樹的一種,但是它與普通線段樹不同的地方在於,普通線段樹節點的區間代...

資料結構 主席樹 COGS 2211 談笑風生

輸入檔案 laugh.in輸出檔案 laugh.out簡單對比 時間限制 3 s 記憶體限制 512 mb 問題描述 設t 為一棵有根樹,我們做如下的定義 設a和b為t 中的兩個不同節點。如果a是b的祖先,那麼稱 a比b不知道高明到 去了 設a 和 b 為 t 中的兩個不同節點。如果 a 與 b 在...