#44. 【HNSDFZ2016 #6】可持久化线段树

统计

题目描述

现有一序列 AA。您需要写一棵可持久化线段树,以实现如下操作:

  • A v p x:对于版本v的序列,给 ApAp 增加 xx.
  • Q v l r:对于版本v的序列,询问 A[l,r]A[l,r] 的区间和。
  • C v:拷贝一份版本v的序列,编号为当前版本总数+1.

版本号从 11 开始;版本 11 的序列,所有元素均为 00.

格式

输入格式

第一行,两个正整数 n,mn,m,表示序列的长度和操作个数。

接下来 mm 行,每行输入一个操作,格式如题目描述所述。

保证任何输入的数都是正整数

输出格式

对于每一个Q操作,输出一行一个整数,表示对应的区间和。

样例数据

样例输入

  1. 5 5
  2. A 1 2 3
  3. Q 1 1 4
  4. C 1
  5. A 2 3 2
  6. Q 2 1 4

样例输出

  1. 3
  2. 5

解释

第一次操作后,版本1的序列为:0 3 0 0 0.

第二次操作询问版本1的A[1,4]A[1,4]区间和,答案为0+3+0+0=30+3+0+0=3.

第三次操作将版本1的序列复制到版本2.

第四次操作后,版本2的序列为:0 3 2 0 0.

第五次操作询问版本2的A[1,4]A[1,4]区间和,答案为0+3+2+0=50+3+2+0=5.

数据规模与约定

对于20%20%的数据,有n≤1000,m≤100n≤1000,m≤100.

对于40%40%的数据,有n≤100000,m≤50000n≤100000,m≤50000.

对于100%100%的数据,有n≤1000000,m≤1500000n≤1000000,m≤1500000.

对于100%100%的数据,v,p,l,rv,p,l,r均合法;为了避免爆int,保证1≤x≤101≤x≤10.

时间限制:1s1s

空间限制:128MB

  1. #include<cstdio>
  2. using namespace std;
  3. int read(){
  4. register int x=,f=;
  5. register char ch=getchar();
  6. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  7. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  8. return x*f;
  9. }
  10. const int N=1.5e6+;
  11. const int s=(<<);
  12. struct node{int v,next;}e[N];
  13. struct data{
  14. int opt,ver,l,r;
  15. }o[N];int cnt=,tot=;
  16. int n,m,last[N],head[N],ans[N],t[s<<];
  17. void add(int x,int y){
  18. e[++tot]=(node){y,head[x]};head[x]=tot;
  19. }
  20. void updata(int x,int p){
  21. for(x+=s;x;x>>=) t[x]+=p;
  22. }
  23. void del(int x,int p){
  24. for(x+=s;x;x>>=) t[x]-=p;
  25. }
  26. inline int query(int l,int r){
  27. int ret=;
  28. for(l+=s-,r+=s+;l^r^;l>>=,r>>=){
  29. if(!(l&)) ret+=t[l^];
  30. if(r&) ret+=t[r^];
  31. }
  32. return ret;
  33. }
  34. void dfs(int x){
  35. if(o[x].opt==) updata(o[x].l,o[x].r);
  36. else if(o[x].opt==) ans[x]=query(o[x].l,o[x].r);
  37. for(int i=head[x];i;i=e[i].next) dfs(e[i].v);
  38. if(o[x].opt==) del(o[x].l,o[x].r);
  39. }
  40. int main(){
  41. n=read();m=read();char s[];
  42. last[]=;
  43. for(int i=;i<=m;i++){
  44. scanf("%s",s);o[i].ver=read();
  45. if(s[]=='C') o[i].opt=;
  46. else if(s[]=='A') o[i].opt=;
  47. else o[i].opt=;
  48. if(o[i].opt){
  49. o[i].l=read();o[i].r=read();
  50. add(last[o[i].ver],i);
  51. last[o[i].ver]=i;
  52. }
  53. else{
  54. add(last[o[i].ver],i);
  55. last[++cnt]=i;
  56. }
  57. if(o[i].opt!=) ans[i]=-;
  58. }
  59. dfs();
  60. for(int i=;i<=m;i++) if(ans[i]!=-) printf("%d\n",ans[i]);
  61. return ;
  62. }

PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树的更多相关文章

  1. 【bzoj4026】dC Loves Number Theory 可持久化线段树

    题目描述 dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源.  给定一个长度为 n的正整数序列A,有q次询问,每次询问一段区间内所有元素乘积的φ(φ(n ...

  2. (bzoj4408)[FJOI2016]神秘数(可持久化线段树)

    (bzoj4408)[FJOI2016]神秘数(可持久化线段树) bzoj luogu 对于一个区间的数,排序之后从左到右每一个数扫 如果扫到某个数a时已经证明了前面的数能表示[1,x],那么分情况: ...

  3. 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1878  Solved: 846[Submit][Status ...

  4. 【BZOJ-2653】middle 可持久化线段树 + 二分

    2653: middle Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1298  Solved: 734[Submit][Status][Discu ...

  5. HDU 4866 Shooting(持久化线段树)

    view code//第二道持久化线段树,照着别人的代码慢慢敲,还是有点不理解 #include <iostream> #include <cstdio> #include & ...

  6. 【BZOJ-3653】谈笑风生 DFS序 + 可持久化线段树

    3653: 谈笑风生 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 628  Solved: 245[Submit][Status][Discuss] ...

  7. 【BZOJ3673】&&【BZOJ3674】: 可持久化并查集 by zky 可持久化线段树

    没什么好说的. 可持久化线段树,叶子节点存放父亲信息,注意可以规定编号小的为父亲. Q:不是很清楚空间开多大,每次询问父亲操作后修改的节点个数是不确定的.. #include<bits/stdc ...

  8. 【BZOJ3207】花神的嘲讽计划I 可持久化线段树/莫队

    看到题目就可以想到hash 然后很自然的联想到可持久化权值线段树 WA:base取了偶数 这道题还可以用莫队做,比线段树快一些 可持久化线段树: #include<bits/stdc++.h&g ...

  9. 【BZOJ 3674】可持久化并查集加强版&【BZOJ 3673】可持久化并查集 by zky 用可持久化线段树破之

    最后还是去掉异或顺手A了3673,,, 并查集其实就是fa数组,我们只需要维护这个fa数组,用可持久化线段树就行啦 1:判断是否属于同一集合,我加了路径压缩. 2:直接把跟的值指向root[k]的值破 ...

随机推荐

  1. linq to entity常用操作

    一.聚合函数查询 ; using (xxxEntities db = new xxxEntities()) { sum = db.userinfo.AsNoTracking().Where(d =&g ...

  2. 从接口、抽象类到工厂模式再到JVM来总结一些问题

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 涉及到的知识点总结如下: 为什么使用接口? 接口和抽象类的区别 简单工厂模式总结 Java中new和newInstance的区别 J ...

  3. objC与js通信实现--WebViewJavascriptBridge

    场景   在移动端开发中,最为流行的开发模式就是hybmid开发,在这种native和h5的杂糅下,既能在某些需求中保证足够的性能,也可以在某些列表详情的需求下采用h5的样式控制来丰富内容.但是在大型 ...

  4. JS将秒转换为 天-时-分-秒

    记录一下,备忘.. function SecondToDate(msd) { var time =msd if (null != time && "" != tim ...

  5. Grunt学习使用

    原文地址:Grunt学习使用必看 grunt简介神马的不多说,到处一大堆. 我只说说我已经实现了的代码. 按照官方的教程 相信已经配置好了,接下来说 package.json 和 Gruntfile. ...

  6. Bloom Filter:海量数据的HashSet

    Bloom Filter一般用于数据的去重计算,近似于HashSet的功能:但是不同于Bitmap(用于精确计算),其为一种估算的数据结构,存在误判(false positive)的情况. 1. 基本 ...

  7. js正则表达式校验正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. Delphi_02_Delphi程序的结构

    一.工程文件 program MultiUnit; {$APPTYPE CONSOLE} uses SysUtils, Unit1 in 'Unit1.pas'; begin //引用unit1中的变 ...

  9. JAVA基础培训(isoft)

    我们

  10. (学习笔记)laravel 中间件

    (学习笔记)laravel 中间件 laravel的请求在进入逻辑处理之前会通过http中间件进行处理. 也就是说http请求的逻辑是这样的: 建立中间件 首先,通过Artisan命令建立一个中间件. ...