题目大意:需要维护一个长度为 N 的数组,支持在历史版本上单点修改和单点查询。

题解:显然,如果直接暴力维护的话会 MLE。因此,采用线段树进行维护,使得空间复杂度由 \(O(mn)\) 降至 \(O(mlogn)\),不过相应的时间复杂度由 \(O(1)\) 上升至 \(O(logn)\)。

代码如下

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1e6+10;
  4. inline int read(){
  5. int f=1,x=0;char ch;
  6. do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
  7. do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
  8. return f*x;
  9. }
  10. int n,m,a[maxn];
  11. struct node{
  12. #define ls(x) t[x].lc
  13. #define rs(x) t[x].rc
  14. int lc,rc,val;
  15. }t[maxn*20];
  16. int tot,root[maxn],cnt;
  17. int build(int l,int r){
  18. int x=++tot;
  19. if(l==r){t[x].val=a[l];return x;}
  20. int mid=l+r>>1;
  21. ls(x)=build(l,mid),rs(x)=build(mid+1,r);
  22. return x;
  23. }
  24. int modify(int pre,int l,int r,int pos,int val){
  25. int x=++tot;
  26. t[x]=t[pre];
  27. if(l==r){t[x].val=val;return x;}
  28. int mid=l+r>>1;
  29. if(pos<=mid)ls(x)=modify(ls(pre),l,mid,pos,val);
  30. else rs(x)=modify(rs(pre),mid+1,r,pos,val);
  31. return x;
  32. }
  33. int query(int x,int l,int r,int pos){
  34. if(l==r)return t[x].val;
  35. int mid=l+r>>1;
  36. if(pos<=mid)return query(ls(x),l,mid,pos);
  37. else return query(rs(x),mid+1,r,pos);
  38. }
  39. void read_and_parse(){
  40. n=read(),m=read();
  41. for(int i=1;i<=n;i++)a[i]=read();
  42. root[0]=build(1,n);
  43. }
  44. void solve(){
  45. while(m--){
  46. int i=read(),opt=read();
  47. if(opt==1){
  48. int pos=read(),val=read();
  49. root[++cnt]=modify(root[i],1,n,pos,val);
  50. }else{
  51. int pos=read();
  52. root[++cnt]=root[i];
  53. printf("%d\n",query(root[cnt],1,n,pos));
  54. }
  55. }
  56. }
  57. int main(){
  58. read_and_parse();
  59. solve();
  60. return 0;
  61. }

【洛谷P3919】可持久化数组的更多相关文章

  1. 洛谷 P3919 可持久化线段树 题解

    题面 这题好水的说~很明显就是主席树的大板子 然而我交了3遍才调完所有的BUG,开好足够的数组,卡掉大大的常数: 针对与每次操作,change()会创建新节点,而ask()虽然也会更新左右儿子的节点编 ...

  2. 洛谷 P3919 【模板】可持久化数组(可持久化线段树/平衡树)-可持久化线段树(单点更新,单点查询)

    P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...

  3. 洛谷P3919 【模板】可持久化数组 [主席树]

    题目传送门 可持久化数组 题目描述 如题,你需要维护这样的一个长度为 $N$ 的数组,支持如下几种操作 在某个历史版本上修改某一个位置上的值 访问某个历史版本上的某一位置的值 此外,每进行一次操作(对 ...

  4. 洛谷——P3919 【模板】可持久化数组(可持久化线段树/平衡树)

    P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...

  5. 洛谷P3919 【模板】可持久化数组(可持久化线段树/平衡树)

    题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集) 题目描述 如题,你需要维护这样的一个长度为 N 的数组, ...

  6. bzoj3673 & bzoj3674 & 洛谷P3402 可持久化并查集

    题目:bzoj3673:https://www.lydsy.com/JudgeOnline/problem.php?id=3673 bzoj3674:https://www.lydsy.com/Jud ...

  7. 洛谷P3402 可持久化并查集

    n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 说是可持久化并查集,实际上是 ...

  8. [洛谷P3919]【模板】可持久化数组

    题目大意:有两个操作,1:在第x次操作后的版本上修改一个值,2:查询在第x次操作后的版本上的一个节点的值 即: 你需要维护这样的一个长度为N的数组,支持如下几种操作 1.在某个历史版本上修改某一个位置 ...

  9. 2019.01.21 洛谷P3919 【模板】可持久化数组(主席树)

    传送门 题意简述:支持在某个历史版本上修改某一个位置上的值,访问某个历史版本上的某一位置的值. 思路: 用主席树直接维护历史版本即可. 代码: #include<bits/stdc++.h> ...

随机推荐

  1. Runaway argument错误 [Overleaf: 在线Latex] [Type 3问题后续]

    [背景与问题描述] 在Latex中,经常出现各种问题: Runaway argument? {\contentsline {subsection}{\numberline {6.3}General c ...

  2. 分布式监控系统Zabbix--完整安装记录(7)-使用percona监控MySQL

    前面已经介绍了分布式监控系统Zabbix-3.0.3-完整安装记录(2)-添加mysql监控,但是没有提供可以直接使用的Key,太过简陋,监控效果不佳.要想更加仔细的监控Mysql,业内同学们都会选择 ...

  3. Ceph常规操作及常见问题梳理

    Ceph集群管理 每次用命令启动.重启.停止Ceph守护进程(或整个集群)时,必须指定至少一个选项和一个命令,还可能要指定守护进程类型或具体例程. **命令格式如 {commandline} [opt ...

  4. 读《移山之道-VSTS软件开发指南》

    首先,我选择<移山之道>有几个原因.第一,书的名字给我一种新鲜感,而不是像另外两本书那么平常:第二,作者邹欣是老师推荐的,看一看他的书或许能让我发现老师对他推崇备至的原因,而实际上,读完这 ...

  5. SpringMVC视图解析器概述

    不论控制器返回一个String,ModelAndView,View都会转换为ModelAndView对象,由视图解析器解析视图,然后,进行页面的跳转. 控制器处理方法---->ModelAndV ...

  6. 9-Python3从入门到实战—基础之条件控制语句

    Python从入门到实战系列--目录 条件判断 if 条件判断 if 语句语法 if <条件判断1>: <执行1> elif <条件判断2>: <执行2> ...

  7. 软件工程(GZSD2015) 第三次作业提交进度

    第三次作业题目请查看这里:软件工程(GZSD2015)第三次作业 开始进入第三次作业提交进度记录中,童鞋们,虚位以待哈... 2015年4月19号 徐镇.尚清丽,C语言 2015年4月21号 毛涛.徐 ...

  8. css3-弹性盒模型

    first <style> .box{width:1024px;height:100px; border:5px solid black; padding:10px; display:-w ...

  9. ThinkCMF项目部署出现无法加载数据库驱动解决方案

    最近有个TP项目刚从从本地部署到阿里云服务器上,出现了无法加载数据库驱动的错误,提示 :( 无法加载数据库驱动: Think\Db\Driver 这里分享一下出现该错误的解决步骤: 首先记得项目部署到 ...

  10. DockerHub使用简介

    常用的Docker镜像文件都有,就不用自己费劲的一点点配置了,这才是Docker的真正目的.就像Ghost里边含office,直接还原,不用一台台机器安装呢,省时省力,与高效工作的理念相契合. 至于, ...