博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
可持久化线段树
阅读量:4978 次
发布时间:2019-06-12

本文共 1523 字,大约阅读时间需要 5 分钟。

以为例。

 

 

知识点:1.练习可持久化线段树

    2.线段树维护数列。线段树维护数列单点查询仅需O(logn)

    3.记得return root;

    4.记得设置左右儿子

    5.有时需注意cnt的初始大小

#include 
using namespace std;int n,m;int rt[2000002];int ls[2000002 * 20],rs[2000002 * 20];int cnt;int tre[2000002 * 20];int build(int l,int r){ int root = ++cnt; if(l == r) { scanf("%d",&tre[root]); return root; } int mid = (l + r) / 2; ls[root] = build(l,mid); rs[root] = build(mid + 1,r); return root;}int query(int t,int l,int r,int b){ if(l == r)return tre[t]; int mid = (l + r) >> 1; if(b <= mid )return query(ls[t],l,mid,b); else return query(rs[t],mid + 1,r,b);}int updata(int t,int l,int r,int b,int k){ int root = ++cnt; if(l == r) { tre[root] = k; return root; } //错误1:忘记为新建节点root设置左右儿子, //漏了 ls[root] = ls[t]; rs[root] = rs[t]; //if(b <= mid)后面漏了ls[root] = //else 后面漏了rs[root] = ls[root] = ls[t]; rs[root] = rs[t]; int mid = (l + r) / 2; if(b <= mid)ls[root] = updata(ls[t],l,mid,b,k); else rs[root] = updata(rs[t],mid + 1,r,b,k); return root;}int main(){ scanf("%d%d",&n,&m); rt[0] = build(1,n); int x,y,z,a; for(int i = 1;i <= m;i++) { scanf("%d%d%d",&x,&y,&z); if(y == 2) { rt[i] = rt[x]; printf("%d\n",query(rt[x],1,n,z)); } else if(y == 1) { scanf("%d",&a); rt[i] = updata(rt[x],1,n,z,a); } } return 0;}

 

转载于:https://www.cnblogs.com/xyj1/p/10419999.html

你可能感兴趣的文章
USACO Zero Sum
查看>>
微服务技术栈有哪些
查看>>
Appium+python自动化16-appium1.6在mac上环境搭建启动ios模拟器上Safari浏览器
查看>>
哲理:一个美国老工程师的心理话
查看>>
Sql合并两个select查询
查看>>
Ubuntu Server安装图形界面全过程
查看>>
Laravel 返回 JSON 格式
查看>>
magento 修改 paypal order product name
查看>>
JBoss 系列十八:使用JGroups构建块RpcDispatcher构建群组通信应用
查看>>
jsp struts标签迭代各种数据
查看>>
GIS中要素的捕捉以及C++实现
查看>>
存储过程
查看>>
微信开发之 微信支付
查看>>
HTML
查看>>
jsp
查看>>
133. Clone Graph
查看>>
Web服务器优化
查看>>
JSP之request表单的两种提交及乱码处理
查看>>
修改UITableView titleForHeader 的风格样式
查看>>
iOS 之sdwebimage
查看>>