可修改主席樹 樹上可修改主席樹 樹套樹套樹

2022-07-24 02:42:10 字數 2435 閱讀 8215

題目:!思路:其實樹上主席樹是把每一棵主席樹看做樹狀陣列上的乙個點,每次修改log棵主席樹,求區間和的時候同樣log查詢字首和。

上**!

#include#define _(d) while(d(isdigit(ch=getchar())))

using

namespace

std;

const

int n=2e4+5

;int

n,m,rt[n],root[n],q[n],cnt,a[n],b[n],tot;

struct nodet[n*100

];struct dataq[n];

inline

int getid(int x)

inline

int read()

void update(int l,int r,int &x,int y,int pos,int

v)inline

void change(int p,int

v)inline

int cal(int

x)inline

int query(int x,int y,int

k)

else

}returnl;}

intmain()

sort(b+1,b+1+cnt);cnt=unique(b+1,b+1+cnt)-b-1;for(int i=1;i<=n;i++)a[i]=getid(a[i]);

for(int i=1;i<=n;i++)update(1,cnt,root[i],root[i-1],a[i],1

);

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

else

}return0;

}

view code

接下來就是調了一天的樹上可修改主席樹!

題目:其實就是樹上主席樹與可修改主席樹的結合,(至於為什麼我調了一天,因為我弱阿,理直氣壯!)。

這份**還是要常常溫習啊,懶得打注釋,希望我下次還記得我是怎麼寫的qaq

#include#define _(d) while(d(isdigit(ch=getchar())))

using

namespace

std;

const

int n=80005

;int n,m,d[n],fa[n][22],head[n],ne[n<<1],to[n<<1],cnt,tot,rt[n],q[n],a[n],b[n<<1

],vis[n],dfn[n],tt,num[n],sz[n];

struct nodet[n*120];struct dataq[n];

inline

int read()

inline

void insert(int u,int v)

inline

int getid(int x)

void update(int l,int r,int &x,int y,int pos,int

v)void dfs(intx)}

inline

int lca(int x,int

y)inline

void change(int p,int x,int v)

inline

void getq(int x)

inline

int cal(int x)

inline

void cagl(int x)

inline

void cagr(int x)

inline

int query(int x,int y,int a,int b,int

k)

else

}returnl;}

intmain()

tot=0;

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

sort(b+1,b+1+cnt);cnt=unique(b+1,b+1+cnt)-b-1;for(int i=1;i<=n;i++)a[i]=getid(a[i]);dfn[n+1]=n+1;num[n+1]=n+1

; d[

1]=1;dfs(1);for(int i=1;i<=20;i++)for(int j=1;j<=n;j++)fa[j][i]=fa[fa[j][i-1]][i-1

];

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

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

else

printf(

"%d\n

",b[query(q[i].a,q[i].b,lca,fa[lca][0

],k)]);}}

return0;

}

view code

似乎還可以用樹剖套主席樹套樹狀陣列...

可修改主席樹 樹狀陣列套主席樹

普通主席樹可以查詢區間k小值,但若直接修改,則複雜度極大,而可修改主席樹通過樹狀陣列的輔助來修改,大大縮小了時間複雜度,缺點是空間複雜度過大.修改的時間複雜度為o logn 2 空間複雜度為o n logn 2 為了減小修改複雜度,可以修改每個區間管理的範圍.傳統主席樹每個點對應的主席樹管理乙個字首...

主席樹(可持久化線段樹)

我真弱。連主席樹都不會。主席樹相當於多個線段樹,由於相鄰兩棵線段樹的節點的值只有少許不同,因此可以對於和前一棵樹一樣的子樹乙個指標指過去,無需操作,這樣每棵樹o logn 總複雜度o nlogn 以下是區間k大 include include include define n 100005 defi...

主席樹 可持久化線段樹

首先要學會普通的線段樹,然後理解權值線段樹,而主席樹就是多個權值線段樹 我自己的理解 但是這多個權值線段樹之間有公共部分,節約了空間。它一開始是乙個空樹,後來逐個添數,記錄新增的這個數在那個範圍內,並 1,顯然它每次只更新了一條鏈,其他不需要變,這樣就有了多個版本的線段樹。如果求 l,r 範圍內第k...