#include#define mxn 1000000+1放棄尊嚴#define mid(a,b) ((a+b)>>1)
intread()
while(c>='
0'&&c<='9'
)
return x*w;
}int
arr[mxn];
unsigned
intnum,q;
struct
nodenode[
43*mxn];
introot[mxn];
int node_num=-1,rtop=-1
;void update(int
now)
intnewnode()
int newnode(int
now)
void build(int now,int bl,int
br)
intnl,nr;
nl=newnode();
nr=newnode();
node[now].left=nl;
node[now].right=nr;
build(nl,bl,mid(bl,br));
build(nr,mid(bl,br)+1
,br);
update(now);
return;}
int change(int now,int k,int al,int ar,int l,int
r)
if(al<=l&&r<=ar)
else
if(node[n].right!=-1&&mid(l,r)+1
<=al&&ar<=r)
update(n);
}if(l==1&&r==num) root[++rtop]=n;
returnn;}
int ques(int now,int ql,int qr,int l,int
r)
if(ql<=l&&r<=qr) return
n;
intls,rs;
ls=node[n].left;
rs=node[n].right;
if(node[n].left!=-1&&l<=ql&&qr<=mid(l,r))
if(node[n].right!=-1&&mid(l,r)+1
<=ql&&qr<=r)
update(n);
if(l==1&&r==num) root[++rtop]=n;
returnn;}
int find(int now,int ql,int qr,int l,int
r)
if(node[now].right!=-1&&mid(l,r)+1
<=ql&&qr<=r)
}int
main()
if(p==2
) }
return0;
}
這次我放棄了作為了指標黨的尊嚴,選擇了陣列實現,a了。
我心情十分的複雜。
不過時間確實並不優秀,可能我主席樹寫的常數還是太大。
哭了。不過我以後大約還是會用指標多一些。
可持久化陣列
日常不想放題目 luogu p3919 模板 可持久化陣列 題目中要求可以查詢歷史狀態,最暴力的想法是開 a m n 的二維陣列,每次修改暴力複製並修改,每次查詢暴力掃瞄,時間複雜度是 o m n 的,但這顯然是不行的.這個時候其實很容易想到線段樹,但線段樹維護的是當前狀態而無法維護歷史狀態,一種暴...
可持久化陣列
update 最後乙個點時間空間已經放大 標題即題意 有了可持久化陣列,便可以實現很多衍生的可持久化功能 例如 可持久化並查集 如題,你需要維護這樣的乙個長度為 nn 的陣列,支援如下幾種操作 在某個歷史版本上修改某乙個位置上的值 訪問某個歷史版本上的某一位置的值 此外,每進行一次操作 對於操作2,...
模板 可持久化陣列
戳我 為了方便起見,處理的陣列長度為5,起始的陣列元素為1 5,修改是將第乙個位置的陣列元素改為2。建樹規則很簡單,只要在葉子節點上寫上該點的值就可以了。我們發現,這兩棵線段樹中只有乙個葉子節點的值發生了改變,而運算元非常多,假如每次都memset一下,然後修改乙個值,空間上的巨大開銷幾乎無法想象,...