• 可持久化数据结构(待补)


    1.trie的可持久化

    2.线段树的可持久化(主席树)

    可持久化的前提:本身的拓扑结构不变

    可持久化解决的问题:类似于girhub 管理所有的历史版本和现在的版本并支持回滚

    就是可以存下来数据结构的所有历史版本

    git的操作是只会记录每一个版本相比于前一个版本的区别在哪 这里也是用这种思想


    1.可持久化trie

    普通的trie到版本一

    版本一到版本二

     版本二到版本三

     版本三到版本四

     这题就是可持久化的trie树的操作 这里画的边上的字母应该在点上的 这样才好理解

    1.最大异或和

    256. 最大异或和 - AcWing题库

     

    1. #include
    2. using namespace std;
    3. const int N=600010,M=N*25;
    4. int n,m;
    5. int s[N];
    6. int tr[M][2],max_id[M];
    7. int root[M],idx;
    8. void Insert(int i,int k,int p,int q)
    9. {
    10. if(k<0)
    11. {
    12. max_id[q]=i;
    13. return ;
    14. }
    15. int v=s[i]>>k&1;
    16. if(p) tr[q][v^1]=tr[p][v^1];
    17. tr[q][v]=++idx;
    18. Insert(i,k-1,tr[p][v],tr[q][v]);
    19. max_id[q]=max(max_id[tr[q][0]],max_id[tr[q][1]]);
    20. }
    21. int query(int root,int c,int l)
    22. {
    23. int p=root;
    24. for(int i=23;i>=0;i--)
    25. {
    26. int v=c>>i&1;
    27. if(max_id[tr[p][v^1]]>=l)
    28. {
    29. p=tr[p][v^1];
    30. }
    31. else p=tr[p][v];
    32. }
    33. return c^s[max_id[p]];
    34. }
    35. int main()
    36. {
    37. scanf("%d%d",&n,&m);
    38. max_id[0]=-1;
    39. root[0]=++idx;
    40. Insert(0,23,0,root[0]);
    41. for(int i=1;i<=n;i++)
    42. {
    43. int x;
    44. scanf("%d",&x);
    45. s[i]=s[i-1]^x;
    46. root[i]=++idx;
    47. Insert(i,23,root[i-1],root[i]);
    48. }
    49. char op[2];
    50. int l,r,x;
    51. while(m--)
    52. {
    53. scanf("%s",op);
    54. if(*op=='A')
    55. {
    56. scanf("%d",&x);
    57. n++;
    58. s[n]=s[n-1]^x;
    59. root[n]=++idx;
    60. Insert(n,23,root[n-1],root[n]);
    61. }
    62. else
    63. {
    64. scanf("%d%d%d",&l,&r,&x);
    65. printf("%d\n",query(root[r-1],s[n]^x,l-1));
    66. }
    67. }
    68. return 0;
    69. }

    2.可持久化线段树   主席树

    一共有m次修改 会有m+1个版本

    由于有多个版本 所以树的建立肯定不是满足堆的存储的 而是用指针的方式来存

    1. struct node
    2. {
    3. int l,r;//左右儿子
    4. int cnt; //当前区间中一共有多少个数
    5. }

    可持久线段树很难处理区间修改操作

    2.第k小数

    255. 第K小数 - AcWing题库

    1. #include
    2. using namespace std;
    3. const int N=100010,M=10010;
    4. int n,m;
    5. int a[N];
    6. vector<int> nums;
    7. struct Node
    8. {
    9. int l,r;
    10. int cnt;
    11. }tr[4*N+N*17];
    12. int root[N],idx;
    13. int find(int x)
    14. {
    15. return lower_bound(nums.begin(),nums.end(),x)-nums.begin();
    16. }
    17. int build(int l,int r)
    18. {
    19. int p=++idx;
    20. if(l==r) return p;
    21. int mid=l+r>>1;
    22. tr[p].l=build(l,mid),tr[p].r=build(mid+1,r);
    23. return p;
    24. }
    25. int insert(int p,int l,int r,int x)
    26. {
    27. int q=++idx;
    28. tr[q]=tr[p];
    29. if(l==r)
    30. {
    31. tr[q].cnt++;
    32. return q;
    33. }
    34. int mid=l+r>>1;
    35. if(x<=mid) tr[q].l=insert(tr[p].l,l,mid,x);
    36. else tr[q].r=insert(tr[p].r,mid+1,r,x);
    37. tr[q].cnt=tr[tr[q].l].cnt+tr[tr[q].r].cnt;
    38. return q;
    39. }
    40. int query(int q,int p,int l,int r,int k)
    41. {
    42. if(l==r) return r;
    43. int cnt=tr[tr[q].l].cnt-tr[tr[p].l].cnt;
    44. int mid=l+r>>1;
    45. if(k<=cnt)
    46. return query(tr[q].l,tr[p].l,l,mid,k);
    47. else return query(tr[q].r,tr[p].r,mid+1,r,k-cnt);
    48. }
    49. int main()
    50. {
    51. scanf("%d%d",&n,&m);
    52. for(int i=1;i<=n;i++)
    53. {
    54. scanf("%d",&a[i]);
    55. nums.push_back(a[i]);
    56. }
    57. sort(nums.begin(),nums.end());
    58. nums.erase(unique(nums.begin(),nums.end()),nums.end());
    59. root[0]=build(0,nums.size()-1);
    60. for(int i=1;i<=n;i++)
    61. {
    62. root[i]=insert(root[i-1],0,nums.size()-1,find(a[i]));
    63. }
    64. while(m--)
    65. {
    66. int l,r,k;
    67. scanf("%d%d%d",&l,&r,&k);
    68. printf("%d\n",nums[query(root[r],root[l-1],0,nums.size()-1,k)]);
    69. }
    70. return 0;
    71. }

  • 相关阅读:
    [HTML]常用标签的使用
    【STL容器】list
    Nginx解决接口请求超时方案
    数据结构与算法基础(王卓)(5)
    java校园快递代领系统 小程序
    优化开启Nginx的最大并发性能【支持2万到3万并发量!】
    机器学习 --- PCA
    艾美捷AAT别藻蓝蛋白普通储备溶液制备方案
    煤炭行业数智化供应商管理系统方案:数据驱动供应商智慧平台助力企业降本增效
    AI全栈大模型工程师(十九)Semantic Kernel
  • 原文地址:https://blog.csdn.net/lee_14141/article/details/127549936