可持久化陣列 放棄尊嚴

2022-07-22 05:24:18 字數 1615 閱讀 3598

#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一下,然後修改乙個值,空間上的巨大開銷幾乎無法想象,...