可持久化陣列(主席樹)

2022-08-13 12:06:11 字數 2550 閱讀 8077

模板**:

#includeusing

namespace

std;

typedef

long

long

ll;#define mid ((l+r)>>1)

const

int inf=1e9+7,maxnode=24e6+7,maxn=1e6+7

;int

n,m,tmp[maxn],rt[maxn];

intval[maxnode],lson[maxnode],rson[maxnode],sz;

void init(int &x,int l,int

r) init(lson[x],l,mid);

init(rson[x],mid+1

,r);

}void modify(int &x,int l,int r,int p,int q,int

v) lson[x]=lson[p];

rson[x]=rson[p];

val[x]=val[p];

if(q<=mid)

modify(lson[x],l,mid,lson[p],q,v);

else

modify(rson[x],mid+1

,r,rson[p],q,v);

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

q)int

main()

else

}return0;

}

view code

原題鏈結題面:

可持久化陣列實現

1.結構:主席樹

2.思想:對於每乙個版本的數組建一棵線段樹,因為相鄰版本差異為乙個數字,所以單次修改時間空間複雜度均為o(logn)

3.實現

const

int maxn數字個數,maxnode節點個數(2*n+nlogn)

intn數字個數,m查詢個數,tmp[maxn]讀入數值暫存陣列,rt[maxn]每個版本的線段樹的根;

int val[maxnode]線段樹值,lson[maxnode]左兒子,rson[maxnode]右兒子,sz節點棧頂;

讀入並建樹,將版本為0的線段樹為初始樹根

scanf("

%d%d

",&n,&m);

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

scanf("%d

",tmp+i);

init(rt[

0],1,n);

按照動態開點線段樹常規方法建樹

void init(int &x,int l,int

r) init(lson[x],l,mid);

init(rson[x],mid+1

,r);

}

完整**: 

1 #include2

using

namespace

std;

3 typedef long

long

ll;4

#define mid ((l+r)>>1)

5const

int inf=1e9+7,maxnode=24e6+7,maxn=1e6+7;6

intn,m,tmp[maxn],rt[maxn];

7int

val[maxnode],lson[maxnode],rson[maxnode],sz;

8void init(int &x,int l,int

r)14

init(lson[x],l,mid);

15 init(rson[x],mid+1

,r);16}

17void modify(int &x,int l,int r,int p,int q,int

v)23 lson[x]=lson[p];

24 rson[x]=rson[p];

25 val[x]=val[p];

26if(q<=mid)

27modify(lson[x],l,mid,lson[p],q,v);

28else

29 modify(rson[x],mid+1

,r,rson[p],q,v);30}

31int query(int x,int l,int r,int

q)38

intmain()else53}

54return0;

55 }

view code

可持久化線段樹(主席樹)及可持久化陣列

定義 可以訪問歷史版本的線段樹為可持久化線段樹 可持久化線段樹之所以可以訪問歷史版本,是因為巨集觀上看,它為每個版本維護了一棵樹。當然,如果真的對每個版本建一顆樹,時間空間複雜度都hold不住。所以建立i版本的樹時,如果某顆子樹相對於i 1版本沒有變化,就可以直接使其父親對應的指標指向i 1版本的這...

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

題目描述 給定n個正整數構成的序列,將對於指定的閉區間查詢其區間內的第k小值。輸入格式 第一行包含兩個正整數n m,分別表示序列的長度和查詢的個數。第二行包含n個正整數,表示這個序列各項的數字。接下來m行每行包含三個整數 l,r,kl,r,k 表示查詢區間 l,r l,r 內的第k小值。輸出格式 輸...

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

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