题面

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

然而我交了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. Java中截取字符串中小数点前面的字符

    通过下标获取 String number = "2563.2154"; int index = number.indexOf("."); String intN ...

  2. (Java多线程系列三)线程间通讯

    Java多线程间通讯 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同. 1.使用wait()和notify()方法在线程中通讯 需求:第一个线程写入(input)用户,另一个线程 ...

  3. Vue-CLI项目搭建

    一.环境搭建 1.安装服务器node 官网下载 https://nodejs.org/zh-cn/ node:用C++语言编写,用来运行JavaScript语言 node可以为前端项目提供server ...

  4. Python3学习笔记(十二):闭包

    闭包定义: 在一个外函数中定义了一个内函数,内函数里引用了外函数的临时变量,并且外函数的返回值是内函数的引用.这样就构成了一个闭包. 我们先来看一个简单的函数: def outer(a): b = 1 ...

  5. 如何基于String实现同步锁?

    在某些时候,我们可能想基于字符串做一些事情,比如:针对同一用户的并发同步操作,使用锁字符串的方式实现比较合理.因为只有在相同字符串的情况下,并发操作才是不被允许的.而如果我们不分青红皂白直接全部加锁, ...

  6. Vue学习日记(二)——Vue核心思想

    前言 Vue.js是一个提供MVVM数据双向绑定的库,其核心思想无非就是: 数据驱动 组件系统 数据驱动 Vue.js 的核心是一个响应的数据绑定系统,它让数据与DOM保持同步非常简单.在使用 jQu ...

  7. SSH三大框架整合配置详解

    首先,三大框架整合,肯定是要导入相当多的jar包,这是不容置疑的!     这里就不一一列举了,直接截图吧:             (1) 基于配置文件的整合:        第一步:我们需要在we ...

  8. 关于虚拟机中Linux系统无法上网之后的解决方案

    我刚刚安装好虚拟机上的Linux的时候,宿主机网络正常,但虚拟机中虽然显示网络连接正常,但无法上网,因此我打开了网络设置 这是默认设置,但上不了网,而按照网上的查找结果,选择NAT是没错的,但仅限于w ...

  9. Daily Schedule

    8.29~9.2周报: 完成Forward Path页面测试用例 2天 完成当前Return Path可执行控件的相关测试用例 1.5天 整理更新web自动化测试用例文档 1天 跟踪定位SNMP自动化 ...

  10. C++构造函数调用虚函数的后果

    #include <iostream> class cx { public: virtual void func() { std::cout << "func&quo ...