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

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. 这两天学到的简单Linux的命令

    1. 定时执行命令查看命令的接口 watch -n kubectl get pods -n kube-ops 每十秒钟查看一下命令运行接口 2. 后台方式运行 jenkins 当前窗口关闭不影响执行结 ...

  2. PHP开发APP接口实现--基本篇

    最近一段时间一直在做APP接口,总结一下APP接口开发以来的心得,与大家分享: 1. 客户端/服务器接口请求流程: 安卓/IOS客户端   –> PHP接口 –> 服务器端  –> ...

  3. 使用AutoMapper实现Dto和Model的自由转换(上)

    在实际的软件开发项目中,我们的“业务逻辑”常常需要我们对同样的数据进行各种变换.例如,一个Web应用通过前端收集用户的输入成为Dto,然后将Dto转换成领域模型并持久化到数据库中.另一方面,当用户请求 ...

  4. Square Numbers UVA - 11461(水题)

    #include <iostream> #include <cstdio> #include <sstream> #include <cstring> ...

  5. IDEA中在目录中如何快速指定到当前的类

    类似于myeclipse的 Link with Editor 其实也在IDEA的这个位置,跟狙击镜的图标一样,叫做Scroll from Source 不同的的是,IDEA的这个功能,需要手动点击,才 ...

  6. MT【197】存在$a,b$对于任意的$x$

    已知$f(x)=ax^2+bx-\dfrac{1}{4}$,若存在$a,b\in R$,使得对于任意的$x\in[0,7],|f(x)|\le2$恒成立,求$|a|$的最大值____ 提示:$|ax^ ...

  7. 【题解】 bzoj2435: [Noi2011]道路修建 (傻逼题)

    bzoj2435,懒得复制,戳我戳我 Solution: 模拟即可(有点傻逼啊 Code: //It is coded by Ning_Mew on 5.13 #include<bits/std ...

  8. Python(3)---从迭代器到异步IO

    whenif 关注 2017.02.13 23:48* 字数 1750 阅读 250评论 0喜欢 8 目录 1. 迭代(iteration)与迭代器(iterator) 1.1 构建简单迭代器 1.2 ...

  9. Java中多个异常的捕获顺序(多个catch)

    import java.io.IOException; public class ExceptionTryCatchTest { public void doSomething() throws IO ...

  10. hdu 2433 Travel

    http://acm.hdu.edu.cn/showproblem.php?pid=2433 题意: 求删除任意一条边后,任意两点对的最短路之和 以每个点为根节点求一个最短路树, 只需要记录哪些边在最 ...