标签:连接 不能 解决 space 心得 can ini amp 改变
题目链接:https://syzoj.com/problem/247
解题心得:
// // ┏┛ ┻━━━━━┛ ┻┓ // ┃ ┃ // ┃ ━ ┃ // ┃ ┳┛ ┗┳ ┃ // ┃ ┃ // ┃ ┻ ┃ // ┃ ┃ // ┗━┓ ┏━━━┛ // ┃ ┃ 神兽保佑 // ┃ ┃ 代码无BUG! // ┃ ┗━━━━━━━━━┓ // ┃ ┣┓ // ┃ ┏┛ // ┗━┓ ┓ ┏━━━┳ ┓ ┏━┛ // ┃ ┫ ┫ ┃ ┫ ┫ // ┗━┻━┛ ┗━┻━┛ #include <bits/stdc++.h> using namespace std; const int maxn = 1e7+7; int lson[maxn], rson[maxn], T[maxn]; int n,m,cnt = 0, sz = 0, node[maxn]; void updata(int root) { node[root] = max(node[lson[root]], node[rson[root]]); } void build_tree(int &root, int l, int r){//注意要取地质,因为是创立的新的结点 root = ++sz; if(l == r) { scanf("%d", &node[root]); return ; } int mid = (l + r) >> 1; build_tree(lson[root], l, mid); build_tree(rson[root], mid+1, r); updata(root); } void init() { scanf("%d%d",&n,&m); build_tree(T[++cnt], 1, n); } void change(int& root, int pre, int pos, int l, int r, int va){ root = ++sz;//需要改变的结点 node[root] = node[pre]; if(l == r) { node[root] = va; return ; } lson[root] = lson[pre];//新的结点的儿子直接指向前一刻树的结点 rson[root] = rson[pre]; int mid = (l + r) >> 1; if(mid >= pos) change(lson[root], lson[pre], pos, l, mid, va); else change(rson[root], rson[pre], pos, mid+1, r, va); updata(root); } int query(int root, int ql, int qr, int l, int r) { if(l == ql && r == qr) { return node[root]; } int mid = (l + r) >> 1; if(mid >= qr) return query(lson[root], ql, qr, l, mid); else if(mid < ql) return query(rson[root], ql, qr, mid+1, r); else return max(query(lson[root], ql, mid, l, mid) , query(rson[root], mid+1, qr, mid+1, r)); } int main() { init(); int a,b,c,d; while(m--) { scanf("%d%d%d%d",&a,&b,&c,&d); if(a == 1) { change(T[++cnt], T[b], c, 1, n, d);//T记录第cnt课树是从哪里开始的 } else { int ans = query(T[b], c, d, 1, n); printf("%d\n",ans); } } return 0; }
YSZOJ:#247. [福利]可持久化线段树 (最适合可持久化线段树入门)
标签:连接 不能 解决 space 心得 can ini amp 改变
原文地址:https://www.cnblogs.com/GoldenFingers/p/9435744.html