洛谷P3919 可持久化陣列

2022-05-20 13:18:39 字數 890 閱讀 1183

題目大意:需要維護乙個長度為 n 的陣列,支援在歷史版本上單點修改和單點查詢。

題解:顯然,如果直接暴力維護的話會 mle。因此,採用線段樹進行維護,使得空間複雜度由 \(o(mn)\) 降至 \(o(mlogn)\),不過相應的時間複雜度由 \(o(1)\) 上公升至 \(o(logn)\)。

**如下

#include using namespace std;

const int maxn=1e6+10;

inline int read()while(ch<'0'||ch>'9');

dowhile(ch>='0'&&ch<='9');

return f*x;

}int n,m,a[maxn];

struct nodet[maxn*20];

int tot,root[maxn],cnt;

int build(int l,int r)

int mid=l+r>>1;

ls(x)=build(l,mid),rs(x)=build(mid+1,r);

return x;

}int modify(int pre,int l,int r,int pos,int val)

int mid=l+r>>1;

if(pos<=mid)ls(x)=modify(ls(pre),l,mid,pos,val);

else rs(x)=modify(rs(pre),mid+1,r,pos,val);

return x;

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

void read_and_parse()

void solve()else }}

int main()

洛谷P3919 模板 可持久化陣列

題目大意 有兩個操作,1 在第x次操作後的版本上修改乙個值,2 查詢在第x次操作後的版本上的乙個節點的值 即 你需要維護這樣的乙個長度為n的陣列,支援如下幾種操作 1.在某個歷史版本上修改某乙個位置上的值 2.訪問某個歷史版本上的某一位置的值 此外,每進行一次操作 對於操作2,即為生成乙個完全一樣的...

洛谷P3919可持久化線段樹

有了可持久化陣列,便可以實現很多衍生的可持久化功能 例如 可持久化並查集 如題,你需要維護這樣的乙個長度為 n 的陣列,支援如下幾種操作 在某個歷史版本上修改某乙個位置上的值 訪問某個歷史版本上的某一位置的值 此外,每進行一次操作 對於操作2,即為生成乙個完全一樣的版本,不作任何改動 就會生成乙個新...

洛谷P3919 模板 可持久化陣列 主席樹

題目連線 如題,你需要維護這樣的乙個長度為n n的陣列,支援如下幾種操作 在某個歷史版本上修改某乙個位置上的值 訪問某個歷史版本上的某一位置的值 此外,每進行一次操作 對於操作2,即為生成乙個完全一樣的版本,不作任何改動 就會生成乙個新的版本。版本編號即為當前操作的編號 從1開始編號,版本0表示初始...