主席树维护--可持久化数组
Posted --hpy-7m
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主席树维护--可持久化数组相关的知识,希望对你有一定的参考价值。
题意:https://www.luogu.org/problem/P3919
1 #define ios ios_base::sync_with_stdio(0); cin.tie(0); 2 #include <cstdio>//sprintf islower isupper 3 #include <cstdlib>//malloc exit strcat itoa system("cls") 4 #include <iostream>//pair 5 #include <fstream>//freopen("C:\Users\13606\Desktop\草稿.txt","r",stdin); 6 #include <bitset> 7 //#include <map> 8 //#include<unordered_map> 9 #include <vector> 10 #include <stack> 11 #include <set> 12 #include <string.h>//strstr substr 13 #include <string> 14 #include <time.h>//srand(((unsigned)time(NULL))); Seed n=rand()%10 - 0~9; 15 #include <cmath> 16 #include <deque> 17 #include <queue>//priority_queue<int, vector<int>, greater<int> > q;//less 18 #include <vector>//emplace_back 19 //#include <math.h> 20 //#include <windows.h>//reverse(a,a+len);// ~ ! ~ ! floor 21 #include <algorithm>//sort + unique : sz=unique(b+1,b+n+1)-(b+1);+nth_element(first, nth, last, compare) 22 using namespace std;//next_permutation(a+1,a+1+n);//prev_permutation 23 //****************** 24 int abss(int a); 25 int lowbit(int n); 26 int Del_bit_1(int n); 27 int maxx(int a,int b); 28 int minn(int a,int b); 29 double fabss(double a); 30 void swapp(int &a,int &b); 31 clock_t __STRAT,__END; 32 double __TOTALTIME; 33 void _MS(){__STRAT=clock();} 34 void _ME(){__END=clock();__TOTALTIME=(double)(__END-__STRAT)/CLOCKS_PER_SEC;cout<<"Time: "<<__TOTALTIME<<" s"<<endl;} 35 //*********************** 36 #define rint register int 37 #define fo(a,b,c) for(rint a=b;a<=c;++a) 38 #define fr(a,b,c) for(rint a=b;a>=c;--a) 39 #define mem(a,b) memset(a,b,sizeof(a)) 40 #define pr printf 41 #define sc scanf 42 #define ls rt<<1 43 #define rs rt<<1|1 44 typedef long long ll; 45 const double E=2.718281828; 46 const double PI=acos(-1.0); 47 //const ll INF=(1LL<<60); 48 const int inf=(1<<30); 49 const double ESP=1e-9; 50 const int mod=(int)1e9+7; 51 const int N=(int)1e6+10; 52 int read(){ 53 int x=0,f=1;char ch=getchar(); 54 for(;!isdigit(ch);ch=getchar())if(ch==‘-‘)f=-1; 55 for(;isdigit(ch);ch=getchar())x=x*10+ch-‘0‘; 56 return x*f; 57 } 58 59 int tot; 60 int root[N],lson[N*20],rson[N*20]; 61 int a[N],ans[N*20]; 62 63 void build(int &now,int l,int r) 64 { 65 now=++tot; 66 if(l==r) 67 { 68 ans[now]=a[l]; 69 return; 70 } 71 int mid=(l+r)>>1; 72 build(lson[now],l,mid); 73 build(rson[now],mid+1,r); 74 } 75 void update(int &now,int pre,int l,int r,int pos,int val) 76 { 77 now=++tot; 78 lson[now]=lson[pre]; 79 rson[now]=rson[pre]; 80 if(l==r) 81 { 82 ans[now]=val; 83 return; 84 } 85 int mid=(l+r)>>1; 86 if(pos<=mid)update(lson[now],lson[pre],l,mid,pos,val); 87 else update(rson[now],rson[pre],mid+1,r,pos,val); 88 } 89 int Query(int l,int r,int pos,int rt) 90 { 91 if(l==r) 92 return ans[rt]; 93 int mid=(l+r)>>1; 94 if(pos<=mid)return Query(l,mid,pos,lson[rt]); 95 else return Query(mid+1,r,pos,rson[rt]); 96 } 97 98 int main() 99 { 100 int n=read(),m=read(); 101 for(int i=1;i<=n;++i)a[i]=read(); 102 tot=-1; 103 build(root[0],1,n); 104 int version,op,pos,val; 105 for(int i=1;i<=m;++i) 106 { 107 version=read();op=read();pos=read(); 108 if(op==1) 109 val=read(),update(root[i],root[version],1,n,pos,val); 110 else 111 pr("%d ",Query(1,n,pos,root[version])),root[i]=root[version]; 112 } 113 return 0; 114 } 115 116 /**************************************************************************************/ 117 118 int maxx(int a,int b) 119 { 120 return a>b?a:b; 121 } 122 123 void swapp(int &a,int &b) 124 { 125 a^=b^=a^=b; 126 } 127 128 int lowbit(int n) 129 { 130 return n&(-n); 131 } 132 133 int Del_bit_1(int n) 134 { 135 return n&(n-1); 136 } 137 138 int abss(int a) 139 { 140 return a>0?a:-a; 141 } 142 143 double fabss(double a) 144 { 145 return a>0?a:-a; 146 } 147 148 int minn(int a,int b) 149 { 150 return a<b?a:b; 151 }
以上是关于主席树维护--可持久化数组的主要内容,如果未能解决你的问题,请参考以下文章