首页 > 代码库 > 可持久化数据结构

可持久化数据结构

可持久化数据结构

题目链接:http://acm.xidian.edu.cn/problem.php?id=1181

用vector实现可持久化

这题要求的是一个支持区间查询的可持久化数据结构。这里使用vector巧妙地实现:pair<time,value>用pair存储时间戳以及当前时间的值,query的时候使用二分查找即可。

代码如下:

 1 #include<cstdio> 2 #include<vector> 3 #include<iostream> 4 #include<algorithm> 5 #define X first 6 #define Y second 7 #define N 1000005 8 using namespace std; 9 typedef pair<int,int> P;10 int n,q,times,type,c,arr[N];11 vector<P>a[N];12 vector<P>::iterator it;13 int lowbit(int x){14     return x&-x;15 }16 int query(int l,int r,int t){17     int ans=0;18     for(int i=r;i>0;i-=lowbit(i)){19         it=upper_bound(a[i].begin(),a[i].end(),make_pair(t,0));20         if(it!=a[i].end()&&it->X==t)ans+=it->Y;21         else if(it!=a[i].begin()){22             it--;23             ans+=it->Y;24         }25     }26     for(int i=l-1;i>0;i-=lowbit(i)){27         it=upper_bound(a[i].begin(),a[i].end(),make_pair(t,0));28         if(it!=a[i].end()&&it->X==t)ans-=it->Y;29         else if(it!=a[i].begin()){30             it--;31             ans-=it->Y;32         }33     }34     return ans;35 }36 void add(int index,int addition){37     int pre;38     for(int i=index;i<=n;i+=lowbit(i)){39         if(a[i].empty())pre=0;40         else pre=a[i].back().Y;41         a[i].push_back(make_pair(times,pre+addition));42     }43 }44 int main(void){45     scanf("%d%d",&n,&q);46     while(q--){47         scanf("%d",&type);48         if(type==1){49             times++;50             int i,x;51             scanf("%d%d",&i,&x);52             add(i^c,x);53             arr[i^c]+=x;54             c=arr[i^c];55         }else if(type==2){56             int l,r,t;57             scanf("%d%d%d",&l,&r,&t);58             c=query(l^c,r^c,t);59             printf("%d\n",c);60         }61     }62 }

 

可持久化数据结构