首页 > 其他分享 >P3919 【模板】可持久化线段树 1(可持久化数组) 题解

P3919 【模板】可持久化线段树 1(可持久化数组) 题解

时间:2023-05-16 18:24:09浏览次数:38  
标签:rt opt p1 持久 val int 题解 mid P3919

一、题目描述:

  维护这样的一个长度为 $n$ 的数组,支持以下两种操作

    $1$:在某个历史版本上修改某一个位置上的值

    $2$:访问某个历史版本上的某一位置的值

  每进行一次操作,就会生成一个新的版本(对于操作2,生成的就是一个完全一样的版本)。

  版本编号即为当前操作的编号(从 $1$ 开始编号,版本 $0$ 表示初始状态数组)。共有 $m$ 次询问。

  数据范围:$1 \leq n,m \leq 10^6$ 。


 二、解题思路:

  板子题,不需要思路。主席树,时空复杂度均为 $O(nlogn)$ 。


 三、完整代码:

 1 #include<iostream>
 2 #define N 1000010
 3 using namespace std;
 4 int n,m,k,x,y,opt,tot;
 5 int a[N],rt[N];
 6 struct ST{
 7     int ls,rs,val;
 8 }t[N*80];
 9 void build(int &p,int l,int r)
10 {
11     if(!p)    p=++tot;
12     if(l==r)
13     {
14         t[p].val=a[l];
15         return ;
16     }
17     int mid=(l+r)>>1;
18     build(t[p].ls,l,mid);
19     build(t[p].rs,mid+1,r);
20 }
21 void update(int &p1,int p2,int l,int r,int pos,int val)
22 {
23     if(!p1)    p1=++tot;
24     if(l==r)
25     {
26         t[p1].val=val;
27         return ;
28     }
29     int mid=(l+r)>>1;
30     if(pos<=mid)
31     {
32         t[p1].rs=t[p2].rs;
33         update(t[p1].ls,t[p2].ls,l,mid,pos,val);
34     }
35     else
36     {
37         t[p1].ls=t[p2].ls;
38         update(t[p1].rs,t[p2].rs,mid+1,r,pos,val);
39     }
40 }
41 int query(int p,int l,int r,int pos)
42 {
43     if(l==r)  return t[p].val; int mid=(l+r)>>1;
44     if(pos<=mid)return query(t[p].ls,l,mid,pos);
45     else        return query(t[p].rs,mid+1,r,pos);
46 }
47 int main()
48 {
49     ios::sync_with_stdio(false);
50     cin.tie(0);cout.tie(0);
51     cin>>n>>m;
52     for(int i=1;i<=n;i++)
53         cin>>a[i];
54     build(rt[0],1,n);
55     for(int i=1;i<=m;i++)
56     {
57         cin>>k>>opt;
58         if(opt==1)
59         {
60             cin>>x>>y;
61             update(rt[i],rt[k],1,n,x,y);
62         }
63         if(opt==2)
64         {
65             cin>>x;rt[i]=rt[k];
66             cout<<query(rt[i],1,n,x)<<'\n';
67         }
68     }
69     return 0;
70 }

 四、写题心得:

  根本就很简单嘛!之前以为主席树是特别玄学的东西,结果今天一遍就过了。有一点线段树合并的感觉。加油,拜拜!

标签:rt,opt,p1,持久,val,int,题解,mid,P3919
From: https://www.cnblogs.com/yhy-trh/p/P3919.html

相关文章

  • 题解:独占访问2 Exclusive Access 2
    题目链接怎么唯一一篇题解这么抽象,完全看不懂给定一张无向图,求给这张图定向成DAG之后的最长路最短是多少。转化一下变成对DAG进行分层,每一层之间的点没有连边,使得层数尽可能少,那么最后的层数就是答案。那么就求出若干个独立集,让独立集总数尽可能少。这是经典的色数问题,我们......
  • GYM102392 简要题解
    自己下午闲着没事单挑了一下,两小时左右一度rk1,但后继无力了。。。。A.MaxorMin肯定沿着出现过的数操作;然后发现如果a[i]=k,a[j]>k,a[k]<k就会增加一次操作所以维护一下差分序列即可。B.LevelUp两维DP,这个疑似edu出过。要注意的是:需要关于x排个序,不然会漏一些转移。D.......
  • AT_dp_s 题解
    题目传送门第一道数位\(\text{dp}\),检验一下自己懂没懂。特别感谢\(\text{yinhee}\)大佬,他的讲解令我受益匪浅。题目分析\(dp_{pos,res,lim}\)为当前枚举到从高位往低位数第\(pos\)位,数字和取模后的余数为\(res\)时的方案数,其中\(lim\)可以理解为一个布尔值,\(0\)表......
  • abc260_g Scalene Triangle Area 题解
    题目传送门题意给定一个大小为\(n\timesn\)的字符矩阵,每个字符为X或者O。对于一个位于\((x,y)\)的字符o和一个格子\((u,v)\),如果满足以下条件,那么\((u,v)\)就可以被\((x,y)\)控制。\(x\leqslantu\leqslantn\),\(y\leqslantv\leqslantn\)。\((u-x)+\fr......
  • 前端传递参数与后端接收的类属性不一致问题解决办法
    使用@JsonAlias作用是在反序列化的时候可以让Bean的属性接收多个json字段的名称。可以加在字段上或者getter和setter方法上。publicclassUser{ @JsonAlias({"name","user"}) privateStringusername; privateStringpassword; privateIntegerage;}这样子......
  • JOISC 2018 题解
    没做计算几何题和提交答案题。JOISC2018Day1ConstructionofHighway道路建设注意到题目中的操作相当于就是到根的路径染色,我们离线下来进行树剖,每条重链维护连续段,然后显然均摊会修改\(O(n\logn)\)段。我们每次修改时可以取出所有连续段,然后题目问逆序对数,我们对这些连续......
  • ORA-02049:超时:分布式事务处理等待锁 问题解决
    数据库添加DBLink后,很容易出现一个问题:ORA-02049:超时:分布式事务处理等待锁ORA-02063:紧接着line(起自ODS_LINK) 问题原因分析:第一次执行操作后出错,数据库没有提交或回退,未关闭原有数据库窗口,重新打开新窗口执行数据插入操作,报ORA-02049错误。解决办法:数据库登陆管理员账号查看1、......
  • 跨域问题解决记录Access-Control-Allow-Origin方法
      more_set_headers 'Access-Control-Allow-Origin: http://devops.opsenv.com';    more_set_headers 'Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS';    more_set_headers 'Access-Control-Allow-Headers: Authorization,DNT,......
  • el-popover无法弹出的问题解决
    1、不能再el-popover上⾯使⽤v-if进⾏显⽰隐藏,应该⽤v-show2、在每⼀个el-popover上都增加⼀个ref确定每个el-popover都是唯⼀的,:ref="`node-popover-${scope.row.id}`"3、需要使⽤slot="reference"定义由哪个元素触发事件。除此之外,还有一种特殊情况就是在table使用el-popover也......
  • execjs - 编码报错问题解决方案
    当在Python中运行execjs时遇到编码问题,可能是由于JS代码中使用了非UTF-8编码。为了解决这个问题,您可以尝试以下两种方案最直接方法需要修改Subprocess中的Enconding为"Utf-8"将JS代码转换为UTF-8编码您可以在JS代码中将所有字符串转换为UTF-8编码。例如,您可以在JS代码文件......