模板**:
#includeusingview codenamespace
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;
}
原題鏈結題面:
可持久化陣列實現
1.結構:主席樹
2.思想:對於每乙個版本的數組建一棵線段樹,因為相鄰版本差異為乙個數字,所以單次修改時間空間複雜度均為o(logn)
3.實現
const讀入並建樹,將版本為0的線段樹為初始樹根int maxn數字個數,maxnode節點個數(2*n+nlogn)
intn數字個數,m查詢個數,tmp[maxn]讀入數值暫存陣列,rt[maxn]每個版本的線段樹的根;
int val[maxnode]線段樹值,lson[maxnode]左兒子,rson[maxnode]右兒子,sz節點棧頂;
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 #include2view codeusing
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 }
可持久化線段樹(主席樹)及可持久化陣列
定義 可以訪問歷史版本的線段樹為可持久化線段樹 可持久化線段樹之所以可以訪問歷史版本,是因為巨集觀上看,它為每個版本維護了一棵樹。當然,如果真的對每個版本建一顆樹,時間空間複雜度都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...