luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树)(主席树)
luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<ctime>
#include<queue>
#include<stack>
#define rg register
#define il inline
#define lst long long
#define N 1000050
using namespace std; int n,Q,cnt;
int val[N];
int root[N];
struct TREE{
int ls,rs,v;
}ljl[N*]; il int read()
{
rg int s=,m=;rg char ch=getchar();
while(ch!='-'&&(ch<''||ch>''))ch=getchar();
if(ch=='-')m=-,ch=getchar();
while(ch>=''&&ch<='')s=(s<<)+(s<<)+ch-'',ch=getchar();
return s*m;
} il void build(rg int &now,rg int le,rg int ri)
//现在所在的点(可往回传参), 左端点, 右端点
{
ljl[++cnt]=ljl[now];//新开一个点……
now=cnt;//保证now指的是当点这个点,因为还要传回去赋值给“爸爸的左/右儿子”……具体看后面的递归build
if(le==ri){ljl[now].v=val[le];return;}//如果到单点赋值就ojbk了(同线段树)
rg int mid=(le+ri)>>;
build(ljl[now].ls,le,mid),build(ljl[now].rs,mid+,ri);
//建造左儿子和右儿子,本节点向他们的指针在递归函数往回传参时会赋值(一切都源于一个美丽的“ & ”)
} void Modify(rg int &now,rg int le,rg int ri,rg int kk,rg int x)//很像build
//现在所在的点(可往回传参),左端点,右端点,要修改的点编号,修改后的值
{
ljl[++cnt]=ljl[now];//又要开点了……
now=cnt;//保证now指的是当点这个点,因为还要传回去赋值给“爸爸的左/右儿子”……具体看后面的递归Modify
if(le==ri){ljl[now].v=x;return;}//照样赋值
rg int mid=(le+ri)>>;
if(kk<=mid)Modify(ljl[now].ls,le,mid,kk,x);
else Modify(ljl[now].rs,mid+,ri,kk,x);
//kk在mid左边,就建左孩子,否则建右孩子……需要模拟哦……
} int Query(rg int now,rg int le,rg int ri,rg int kk)
{
if(le==ri)return ljl[now].v;
rg int mid=(le+ri)>>;
if(kk<=mid)return Query(ljl[now].ls,le,mid,kk);
else return Query(ljl[now].rs,mid+,ri,kk);
} int main()
{
n=read(),Q=read();
for(rg int i=;i<=n;++i)val[i]=read();
build(root[],,n);//先按原来的值建一棵线段树在0号根上
for(rg int i=;i<=Q;++i)
{
rg int edi=read(),type=read();//历史版本edi,询问type
if(type==)
{
rg int kk=read(),x=read();//把kk号的val改成x
root[i]=root[edi];//先把根连过来,再修改!
Modify(root[i],,n,kk,x);//从根开始,左,右端点,修改的编号,修改成的值
}
else
{
rg int kk=read();
printf("%d\n",Query(root[edi],,n,kk));//当前节点(也就是edi时的根),左,右端点,询问第kk号的值
root[i]=root[edi];//这个依题,还是弄过来吧……
}
}
return ;
}
luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树)(主席树)的更多相关文章
- 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665
如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...
- 【洛谷】P3919 【模板】可持久化线段树(主席树)
题目 传送门:QWQ 分析 主席树的模板,囤着 代码 #include <bits/stdc++.h> using namespace std; ; ], rs[N*], root[N*] ...
- 洛谷P3834 [模板]可持久化线段树1(主席树) [主席树]
题目传送门 可持久化线段树1(主席树) 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定 ...
- 【Luogu P3834】可持久化线段树(主席树)
Luogu P3834 可持久化数据结构就是支持在历史版本上进行查询和修改操作的数据结构. 主席树就是对线段树的改进,使之可持久化. 前置知识:动态开点线段树 我们利用权值(值域)线段树统计区间内的数 ...
- BZOJ3673 可持久化并查集 by zky 【主席树】
BZOJ3673 可持久化并查集 by zky Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a ...
- 可持久化线段树(主席树)快速简洁教程 图文并茂 保证学会。kth number例题
如果学不会也不要打我. 假设你会线段树 开始! --- 主席树也叫可持久化线段树 顾名思义,它能够保存线段树在每个时刻的版本. 什么叫每个时刻的版本?你可能对一棵普通线段树进行各种修改,这每种样子就是 ...
- 可持久化线段树(主席树)——静态区间第k大
主席树基本操作:静态区间第k大 #include<bits/stdc++.h> using namespace std; typedef long long LL; ,MAXN=2e5+, ...
- BZOJ.1901.Dynamic Rankings(树状数组套主席树(动态主席树))
题目链接 BZOJ 洛谷 区间第k小,我们可以想到主席树.然而这是静态的,怎么支持修改? 静态的主席树是利用前缀和+差分来求解的,那么对于每个位置上的每棵树看做一个点,拿树状数组更新. 还是树状数组的 ...
- [luogu P4197] Peaks 解题报告(在线:kruskal重构树+主席树 离线:主席树+线段树合并)
题目链接: https://www.luogu.org/problemnew/show/P4197 题目: 在Bytemountains有N座山峰,每座山峰有他的高度$h_i$.有些山峰之间有双向道路 ...
随机推荐
- APP性能
一.APP性能维度分析 APP类型众多,根据具体类型划分,性能指标的维度和优先级各不相同.视频类APP归属于娱乐游戏型的APP,因此性能测试维度优先级排序为:流畅度.crash.内存.流量.响应时长 ...
- oracle学习笔记(四) DML数据控制语言和TCL 事务控制语言
DML 数据管理语言 Data manage language insert, update, delete以及select语句,不过,有人也把select单独出来,作为DQL 数据查询语言 data ...
- select 项目<选课系统>
"""1. 创建北京.上海 2 所学校 学校类对象 属性:名字,地址 行为: 2. 创建linux , python , go 3个课程 , linux\py 在北京开, ...
- 一条sql引发的“血案”
前几天有一个项目要上线,需要对表的一个字段进行扩充,项目经理让我准备脚本,于是我准备了如下的脚本: )); )); )); 结果上线的时候,ord_log1和ord_log2表中有30万数据,在执行的 ...
- java通过图片URL下载图片
public InputStream getInputStream(String imgUrl) { InputStream inputStream = null; try{ HttpURLConne ...
- Debug to add expression
Debug expression
- windows下数字以2进制打印
#include <cstdlib> _itoa(num, buf, 2); 打印buf既是二进制
- Python---基础---数据类型的内置函数
2019-05-23 ---------------------------- 一. #数据类型的内置函数Python有哪些数据类型?Number 数值型string 字符型list ...
- 简单的使用redis
心不慌手不抖我们跟着大哥走 https://blog.csdn.net/zhangcongyi420/article/details/82686702
- u盘被占用,无法弹出解决办法
方法1.把鼠标放到电脑屏幕最底部的中央,点击右键,点击 任务管理器 方法2.按:CTRL+ALT+ENTER(回车) 打开任务管理器,点击 进入性能后点击下方的:资源管理器 回到桌面,查看 ...