版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 4348

题意:

  一个长度为n的数组,4种操作 :

    (1)C l r d:区间[l,r]中的数都加1,同时当前的时间戳加1 。

    (2)Q l r:查询当前时间戳区间[l,r]中所有数的和 。

    (3)H l r t:查询时间戳t区间[l,r]的和 。

    (4)B t:将当前时间戳置为t 。

  所有操作均合法 。

解法:

  很明显是一道主席树的题 。

  对于每一次区间加法都新建节点建一棵线段树,加个懒惰标记就行了,查询的话直接线段树区间求和 。

  不过感觉这一题就是为可持续化数据结构写的,特别是时间戳这一点,当前时间戳的版本就是从上一个时间戳继承下来的,而且所有记录都保存了下来,好神奇,感觉对主席树的理解又加深了一点 。

code 主席树

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#define ll long long using namespace std; const int N=+; int root[N],tot;
int Ls[N*],Rs[N*],add[N*];
ll sum[N*]; int n,m; inline int bulidtree(int L,int R){
int k=tot++;
add[k]=; if (L==R){
scanf("%lld",&sum[k]);
return k;
} int mid=(L+R)>>;
Ls[k]=bulidtree(L,mid);
Rs[k]=bulidtree(mid+,R); sum[k]=sum[Ls[k]]+sum[Rs[k]]; return k;
} inline int update(int o,int L,int R,int x,int LL,int RR){
int k=tot++;
Ls[k]=Ls[o]; Rs[k]=Rs[o]; add[k]=add[o]; sum[k]=sum[o]; sum[k]+=(ll)x*(R-L+); if (LL==L && RR==R){
add[k]+=x;
return k;
} int mid=(LL+RR)>>;
if (R<=mid) Ls[k]=update(Ls[k],L,R,x,LL,mid);
else if (L>mid) Rs[k]=update(Rs[k],L,R,x,mid+,RR);
else {
Ls[k]=update(Ls[k],L,mid,x,LL,mid);
Rs[k]=update(Rs[k],mid+,R,x,mid+,RR);
} return k;
} inline ll query(int o,int L,int R,int LL,int RR){
if (L==LL && R==RR) return sum[o]; int mid=(LL+RR)>>; ll ret=(ll)add[o]*(R-L+); if (R<=mid) return ret+query(Ls[o],L,R,LL,mid);
else if (L>mid) return ret+query(Rs[o],L,R,mid+,RR);
else return ret+query(Ls[o],L,mid,LL,mid)+query(Rs[o],mid+,R,mid+,RR);
} int main(){
int x,L,R;
int now;
char ch[]; bool f=false; while (~scanf("%d%d",&n,&m)){
if (f) puts("");
else f=true; tot=;
root[]=bulidtree(,n);
now=; while (m--){
scanf("%s",ch);
if (ch[]=='C') {
scanf("%d%d%d",&L,&R,&x);
now++;
root[now]=update(root[now-],L,R,x,,n);
}
else if (ch[]=='Q') {
scanf("%d%d",&L,&R);
printf("%lld\n",query(root[now],L,R,,n));
}
else if (ch[]=='H'){
scanf("%d%d%d",&L,&R,&x);
printf("%lld\n",query(root[x],L,R,,n));
}
else if (ch[]=='B') {
scanf("%d",&now);
}
}
} return ;
}

hdu 4348 To the moon (主席树)的更多相关文章

  1. HDU 4348 To the moon 主席树 在线更新

    http://acm.hdu.edu.cn/showproblem.php?pid=4348 以前做的主席树没有做过在线修改的题做一下(主席树这种东西正经用法难道不是在线修改吗),标记永久化比较方便. ...

  2. hdu 4348 To the moon (主席树区间更新)

    传送门 题意: 一个长度为n的数组,4种操作 : (1)C l r d:区间[l,r]中的数都加1,同时当前的时间戳加1 . (2)Q l r:查询当前时间戳区间[l,r]中所有数的和 . (3)H ...

  3. HDU 4348 To the moon 主席树

    题意: 给出一个长度为\(n(n \leq 10^5)\)的序列,最开始时间\(t=0\),支持下面几个操作: \(C \, l \, r \, d\):将区间\([l,r]\)每个数都加上\(d\) ...

  4. hdu 4348 To the moon 主席树区间更新

    To the moon Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Prob ...

  5. hdu 4348 To the moon (主席树 区间更新)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4348 题意: 4种操作: C l r c   区间[l,r]加c,时间+1 Q l r    询问当前时 ...

  6. HDU 4348 To the moon(主席树 区间更新)题解

    题意: 给一个数组A[1] ~ A[n],有4种操作: Q l r询问l r区间和 C l r v给l r区间每个数加v H l r t询问第t步操作的时候l r区间和 B t返回到第t步操作 思路: ...

  7. HDU 4348 To the moon(主席树区间修改)

    题意 给你一个区间,支持如下操作: 在一段区间内加上一个值,并生成一个历史版本 查询某个版本下一段区间内的和 回到一个历史版本上并舍弃之后的版本 做法 这就是主席树区间修改裸题啦QwQ 上一篇博客我讲 ...

  8. HDU 4348 To the moon (主席树区间更新)

    题意:首先给你n个数,开始时间为0,最后按照操作输出 给你四种操作: 1. C l r d :  在(l,r)区间都加上d,时间加一2. Q l r :  询问现在(l,r)的区间和3. H l r ...

  9. HDU 4348.To the moon SPOJ - TTM To the moon -可持久化线段树(带修改在线区间更新(增减)、区间求和、查询历史版本、回退到历史版本、延时标记不下放(空间优化))

    To the moon Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

随机推荐

  1. Visual Studio 2015的安装和简单的单元测试

    何为单元测试 绝大多数的软件都是由多人合作完成的,大家的工作相互有依赖关系.软件的很多错误都来源于程序员对模块功能的误解.疏忽或不了解其他模块的变化.如何能让自己负责的模块功能的定义尽量的明确,模块内 ...

  2. acegi security实践教程—入门

    Acegi Security概念    Acegi Security是基于J2EE的企业软件应用提供全面的安全服务.通俗的说,就是封装的安全框架.提到安全,大家脑子中第一反应肯定是权限控制.的确如此, ...

  3. php://input 和 $HTTP_ROW_POST_DATE

    前言: 年前又换了一家公司.毕业半年,加上之前的实习,第四家公司了.短短半年经历了很多,就这样度过了我的2018.毕业.实习.就业.创业.公司倒闭.频繁跳槽.开工作室净赔.年前自我感觉糟透了,一团糟, ...

  4. Alpha冲刺——day3

    Alpha冲刺--day3 作业链接 Alpha冲刺随笔集 github地址 团队成员 031602636 许舒玲(队长) 031602237 吴杰婷 031602220 雷博浩 031602634 ...

  5. pgm3

    这部分主要讨论了一些概念性的东西.一个是常用的 local probabilistic models,一个是如何用 template-based representation. 这部分主要是一些概念, ...

  6. 利用powerful number求积性函数前缀和

    好久没更博客了,先水一篇再说.其实这个做法应该算是杜教筛的一个拓展. powerful number的定义是每个质因子次数都 $\geq 2$ 的数.首先,$\leq n$ 的powerful num ...

  7. 【BZOJ1053】[HAOI2007]反素数(搜索)

    [BZOJ1053][HAOI2007]反素数(搜索) 题面 BZOJ 洛谷 题解 大力猜一下用不了几个质因子,那么随便爆搜一下就好了. #include<iostream> #inclu ...

  8. 【转】STM32 - 程序跳转、中断、开关总中断

    程序跳转注意: 1.如果跳转之前的程序A里有些中断没有关,在跳转之后程序B的中断触发,但程序B里没有定义中断响应函数,找不到地址会导致死机. 2.程序跳转前关总中断,程序跳转后开总中断(关总中断,只是 ...

  9. 洛谷 P1457 城堡 The Castle 解题报告

    P1457 城堡 The Castle 题目描述 我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特别的礼物:一张"幸运爱尔兰" ...

  10. 洛谷P2480 古代猪文

    这道题把我坑了好久...... 原因竟是CRT忘了取正数! 题意:求 指数太大了,首先用欧拉定理取模. 由于模数是质数所以不用加上phi(p) 然后发现phi(p)过大,不能lucas,但是它是个sq ...