题面

这题好水的说~很明显就是主席树的大板子

然而我交了3遍才调完所有的BUG,开好足够的数组,卡掉大大的常数;

针对与每次操作,change()会创建新节点,而ask()虽然也会更新左右儿子的节点编号,但并不会创建除根节点以外的点;

处理好以上change()和ask()的细节就可以轻松地切掉这道题;

#include <bits/stdc++.h>
#define mid (l+r)/2
using namespace std;
int n,m;
int a[];
int cnt;
int b[];
int L[];
int R[];
int root[];
int build(int l,int r)
{
int rt=++cnt;
if(l==r){
a[rt]=b[l];
return rt;
}
L[rt]=build(l,mid);
R[rt]=build(mid+,r);
return rt;
}
int change(int vpre,int vnow,int l,int r,int x,int value)
{
int rt=++cnt;
if(l==r){
if(l==x){
a[rt]=value;
}
return rt;
}
L[rt]=L[vpre];
R[rt]=R[vpre];
if(mid>=x){
L[rt]=change(L[vpre],rt,l,mid,x,value);
}
else{
R[rt]=change(R[vpre],rt,mid+,r,x,value);
}
return rt;
}
int ask(int vpre,int vnow,int l,int r,int x)
{
L[vnow]=L[vpre];
R[vnow]=R[vpre];
if(l==r){
if(l==x){
cout<<a[vnow]<<endl;
}
return vnow;
}
if(x<=mid) L[vnow]=ask(L[vpre],L[vnow],l,mid,x);
else R[vnow]=ask(R[vpre],R[vnow],mid+,r,x);
return vnow;
}
int main ()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d",&b[i]);
}
root[]=build(,n);
for(int i=;i<=m;i++){
int v,opt;
scanf("%d%d",&v,&opt);
if(opt==){
int weizhi,value;
scanf("%d%d",&weizhi,&value);
root[i]=change(root[v],cnt+,,n,weizhi,value);
}
else{
int weizhi;
scanf("%d",&weizhi);
root[i]=++cnt;
ask(root[v],cnt,,n,weizhi);
}
}
}

洛谷 P3919 可持久化线段树 题解的更多相关文章

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

    主席树可以存储线段树的历史状态,空间消耗很大,一般开45n即可 #include <iostream> #include <cstdio> #include <cstri ...

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

    题目:https://www.luogu.org/problemnew/show/P3834 无法忍受了,我要写主席树! 解决区间第 k 大查询问题,可以用主席树,像前缀和一样建立 n 棵前缀区间的权 ...

  3. 「洛谷 P3834」「模板」可持久化线段树 题解报告

    题目描述 给定n个整数构成的序列,将对于指定的闭区间查询其区间内的第k小值. 输入输出格式 输入格式 第一行包含两个正整数n,m,分别表示序列的长度和查询的个数. 第二行包含n个整数,表示这个序列各项 ...

  4. 题解——洛谷P2781 传教(线段树)

    可以说是数据结构学傻了的典型案例了 昨天跳到这题上 然后思考了一下 噫!好!线段树裸题 然后打完板子,发现\(  n \le 10^9 \) 显然线段树直接做不太行 然后这题又只有普及的难度 然后我就 ...

  5. 【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)

    Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...

  6. 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)

    洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ...

  7. 洛谷P4428二进制 [BJOI2018] 线段树

    正解:线段树 解题报告: 传送门! 话说开始看到这题的时候我想得hin简单 因为关于%3有个性质就是说一个数的各个位数之和%3=这个数%3嘛,小学基础知识? 我就想着,就直接建一棵树,只是这棵树要用个 ...

  8. BZOJ2141&洛谷1975 排队 【线段树套treap】

    题目 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和. 红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别,排 ...

  9. 洛谷P3707 [SDOI2017]相关分析(线段树)

    题目描述 Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. Frank不仅喜欢观测,还喜欢分析观测到的数据.他经常分析两个 ...

随机推荐

  1. IE8 浏览器文本模式变为杂项(quirks)页面变形的解决方法

    IE8 浏览器文本模式(document.documentMode)变为杂项(quirks)页面变形的解决方法. 正常情况下 document.documentMode 输出为8,而变为杂项之后doc ...

  2. jquery input选择器 语法

    jquery input选择器 语法 作用::input 选择器选取表单元素.该选择器同样适用于 <button> 元素.大理石平台价格表 语法:$(":input") ...

  3. hdu_3535 (AreYouBusy)

    http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:        给你n个工作集合,给你T的时间去做它们.给你m和s,说明这个工作集合有m件事可以做, ...

  4. 学习sklearn聚类使用

    学习利用sklearn的几个聚类方法: 一.几种聚类方法 1.高斯混合聚类(mixture of gaussians) 2.k均值聚类(kmeans) 3.密度聚类,均值漂移(mean shift) ...

  5. [pytorch笔记] 调整网络学习率

    1. 为网络的不同部分指定不同的学习率 class LeNet(t.nn.Module): def __init__(self): super(LeNet, self).__init__() self ...

  6. 记一次AD域控客户端不能正常加域的故障处理

    1.1  症状现象 DNS 服务器无法在应用程序目录分区 < 分区名称 > 从 Active Directory 中打开区域 < 区域 >.这台 DNS 服务器配置获取并使用此 ...

  7. 分布式-信息方式-ActiveMQ的集群

    ActiveMQ的集群Queue consumer clusters              ActiveMQ支持 Consumer对消息高可靠性的负载平衡消费,如果一个 Consumer死掉,该消 ...

  8. Spring boot之配置server信息

    知识点: 1.修改端口号 2.修改context-path 3.其它配置说明 配置端口号: Spring boot 默认端口是8080, 如果想要进行更改的话, 只需要修改applicatoin.pr ...

  9. JSP——隐式对象(implicit object)

    Servlet容器将几个对象传递给它所运行的Servlet. 例如,在Servlet的service方法中获得HttpServletRequest和HttpServletResponse,并在init ...

  10. java实现二分法查找

    一 前提 使用二分法查找的前提是:有序的数组,没有重复的数据元素.如果没有排序过的,需先排序. 二分法查找时使用场景为:数据量较大时 二 代码 package com.xiao.day01; publ ...