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 [模板]可持久化数组(可持久化线段树/平衡树)(主席树)的更多相关文章

  1. 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665

    如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...

  2. 【洛谷】P3919 【模板】可持久化线段树(主席树)

    题目 传送门:QWQ 分析 主席树的模板,囤着 代码 #include <bits/stdc++.h> using namespace std; ; ], rs[N*], root[N*] ...

  3. 洛谷P3834 [模板]可持久化线段树1(主席树) [主席树]

    题目传送门 可持久化线段树1(主席树) 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定 ...

  4. 【Luogu P3834】可持久化线段树(主席树)

    Luogu P3834 可持久化数据结构就是支持在历史版本上进行查询和修改操作的数据结构. 主席树就是对线段树的改进,使之可持久化. 前置知识:动态开点线段树 我们利用权值(值域)线段树统计区间内的数 ...

  5. BZOJ3673 可持久化并查集 by zky 【主席树】

    BZOJ3673 可持久化并查集 by zky Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a ...

  6. 可持久化线段树(主席树)快速简洁教程 图文并茂 保证学会。kth number例题

    如果学不会也不要打我. 假设你会线段树 开始! --- 主席树也叫可持久化线段树 顾名思义,它能够保存线段树在每个时刻的版本. 什么叫每个时刻的版本?你可能对一棵普通线段树进行各种修改,这每种样子就是 ...

  7. 可持久化线段树(主席树)——静态区间第k大

    主席树基本操作:静态区间第k大 #include<bits/stdc++.h> using namespace std; typedef long long LL; ,MAXN=2e5+, ...

  8. BZOJ.1901.Dynamic Rankings(树状数组套主席树(动态主席树))

    题目链接 BZOJ 洛谷 区间第k小,我们可以想到主席树.然而这是静态的,怎么支持修改? 静态的主席树是利用前缀和+差分来求解的,那么对于每个位置上的每棵树看做一个点,拿树状数组更新. 还是树状数组的 ...

  9. [luogu P4197] Peaks 解题报告(在线:kruskal重构树+主席树 离线:主席树+线段树合并)

    题目链接: https://www.luogu.org/problemnew/show/P4197 题目: 在Bytemountains有N座山峰,每座山峰有他的高度$h_i$.有些山峰之间有双向道路 ...

随机推荐

  1. HBase构架原理

    HBase的概念: HBase在生态圈位置 HBase与HDFS对比 HBase与关系型数据库的比较 HBase表的特点: 4)任意模式:每一行都有一个可排序的主键和任意多的列,列可以根据自己的需要动 ...

  2. Solr的学习使用之(六)获取数据列表-SolrDocumentList

    以下是我项目中获取新闻数据列表的写法,包括数据总量.数据列表,接下来会贴出分片查询(facet)等高级查询 基本的注释都有了: private ListPage<News> queryFr ...

  3. ps:图像格式的选择

    从上面点阵与矢量两者的对比中,似乎矢量格式有优势,那为什么不都使用矢量格式呢? 这是因为矢量图像是基于线段的.因此它不适合记录色彩较为复杂的图像.如下图, 如果使用点阵方式来记录,只要按照顺序扫描并记 ...

  4. Spring---MongoDB

    1.MongoDB概述 1.1.NoSQL数据库 1.1.1.NoSQL的主要特点: 不使用SQL语言   作为查询条件: 数据存储  也不是固定的表.字段: 1.1.2.NoSQL数据库  主要有  ...

  5. exec()和元类

    目录 一.exec()的作用 二.元类 2.1什么是元类,元类的作用是什么? 2.2自定义创建元类 一.exec()的作用 exec执行储存在字符串或文件中的 Python 语句,相比于 eval,e ...

  6. basic deepwalk

    Get to know How deepwalk works by this project. Two steps: 1. gen the graph, and gen the corpus on t ...

  7. python 全栈开发,Day54(关于DOM操作的相关案例,JS中的面向对象,定时器,BOM,client、offset、scroll系列)

    04-jQuery的属性操作 jquery的属性操作模块分为四个部分:html属性操作,dom属性操作,类样式操作和值操作 html属性操作:是对html文档中的属性进行读取,设置和移除操作.比如at ...

  8. php中美元符号是什么意思

    php中$符号是变量符号: 把$符号加上字符串,这个字符串就是一个变量名或对象名. 其实PHP采用的是C语言的语法,但是也有一些区别,$符号加上字符串,这就是一个变量名或对象名. 例如下面的代码:(推 ...

  9. 使用tinymce编辑器从word保持原格式复制粘贴的办法

    官网地址http://ueditor.baidu.com Git 地址 https://github.com/fex-team/ueditor 参考博客地址 http://blog.ncmem.com ...

  10. Prime算法 与 Kruskal算法求最小生成树模板

    算法原理参考链接 ==> UESTC算法讲堂——最小生成树 关于两种算法的复杂度分析 ==> http://blog.csdn.net/haskei/article/details/531 ...