题意:有一个由n个数组成的序列,有4中操作:

1.C l r d [l,r]这段区间都加上d

2.Q l r 询问[l,r]这段区间的和

3.H l r t 询问之前t时间[l,r]的区间和

4.B t 回到t时间,且下一秒的时间从t开始

按时间建立主席树,主席树上的每一棵线段树维护[1,n]这段序列的信息,这里成段更新的时候要注意,以往写线段树的时候,都是把lazy标记向下传,但是写主席树的时候每一次下传,那么新的节点数就会非常多,会爆内存,所以我们不把lazy操作下传,只是在询问的时候,最后累加的答案加上每一个父亲节点上的lazy值。

 #include<cstdio>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=1e5+;
ll a[maxn];
int root[maxn];
struct node
{
int ln,rn;
ll lazy,sum;
}tree[maxn*]; int cnt;
void build(int &x,int l,int r)
{
++cnt;x=cnt;
tree[x].lazy=;
if(l==r){
tree[x].sum=a[l];
return;
}
int mid=l+r>>;
build(tree[x].ln,l,mid);
build(tree[x].rn,mid+,r);
tree[x].sum=tree[tree[x].ln].sum+tree[tree[x].rn].sum;
}
void update(int &x,int y,int L,int R,int l,int r,int val)
{
tree[++cnt]=tree[y];
x=cnt;
if(L==l&&R==r){
tree[cnt].lazy+=val;
tree[cnt].sum+=(R-L+)*val;
return;
}
tree[x].sum+=(R-L+)*val;
int mid=l+r>>;
if(R<=mid) update(tree[x].ln,tree[y].ln,L,R,l,mid,val);
else if(L>mid) update(tree[x].rn,tree[y].rn,L,R,mid+,r,val);
else{
update(tree[x].ln,tree[y].ln,L,mid,l,mid,val);
update(tree[x].rn,tree[y].rn,mid+,R,mid+,r,val);
}
}
ll query(int root,int L,int R,int l,int r)
{
ll ans=;
if(l==L&&r==R) return tree[root].sum;
ans+=(ll)tree[root].lazy*(ll)(R-L+);
int mid=l+r>>;
if(R<=mid) ans+=query(tree[root].ln,L,R,l,mid);
else if(L>mid) ans+=query(tree[root].rn,L,R,mid+,r);
else{
ans+=query(tree[root].ln,L,mid,l,mid);
ans+=query(tree[root].rn,mid+,R,mid+,r);
}
return ans;
}
void init()
{
cnt=;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
init();
for(int i=;i<=n;i++) scanf("%lld",&a[i]);
int now=;
build(root[],,n);
char t1[];int t2,t3,t4;
while(m--){
scanf("%s",t1);
if(t1[]=='Q'){
//当前时间线;
scanf("%d%d",&t2,&t3);
ll ans=query(root[now],t2,t3,,n);
printf("%lld\n",ans);
}
else if(t1[]=='C'){
now++;
scanf("%d%d%d",&t2,&t3,&t4);
update(root[now],root[now-],t2,t3,,n,t4);
}
else if(t1[]=='H'){
//某个时间线;
scanf("%d%d%d",&t2,&t3,&t4);
ll ans=query(root[t4],t2,t3,,n);
printf("%lld\n",ans);
}
else{
//返回某个时间线;
scanf("%d",&t2);
now=t2;
}
}
}
return ;
}

主席树 hdu 4348的更多相关文章

  1. 主席树 hdu 4417

    求一个区间内小于等于limit的数: 主席树模板题. 求出每一个节点的sum: #include<cstdio> #include<algorithm> #include< ...

  2. dfs序 线段树 dfs序列 主席树

    并查集 #include<stdio.h> ]; void sset(int x) { ;i<=x;i++) stt[i]=i; } int ffind(int x) { if(x= ...

  3. 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    询问当前时 ...

  4. hdu 4348 To the moon (主席树)

    版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4348 题意: 一个长度为n的数组,4种操作 : (1)C l r d:区间[l,r]中的数都加1,同时当前的时间戳加1 . (2)Q ...

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

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

  6. To the moon HDU - 4348 (主席树,区间修改)

    Background To The Moon is a independent game released in November 2011, it is a role-playing adventu ...

  7. 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步操作 思路: ...

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

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

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

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

随机推荐

  1. Windows里面的虚拟机,部署的项目在同一网段也可以访问到

    一直想对自己Linux里面部署的项目进行再同一网段进行共享让其他和我同网段的人都看到 今天对于这个问题我终于解决了 首先编辑自己的虚拟机 进行虚拟机网络编辑 选择VMnet8 然后进行下面的NET设置 ...

  2. IntelliJ IDEA实用插件推荐

    IntelliJ在业界被公认为优秀的Java开发平台之一,在智能代码助手.代码自动提示.重构.J2EE支持.代码审查. 创新的GUI设计等方面表现突出,并支持基于Android平台的程序开发.通过插件 ...

  3. Python-Django学习笔记(一)-MTV设计模式

    Django是开源的.大而且全的Web应用框架. 它独具特色,采用了MTV设计模式. MTV框架包括:Model(模型).Template(模板)和View(视图) Model(模型):负责业务对象与 ...

  4. PP: GRU-ODE-Bayes: Continuous modeling of sporadically-observed time series

    From: KU Leuven; ESAT-STADIUS比利时鲁汶大学 ?? How to model real-world multidimensional time series? especi ...

  5. C语言链表总结(创建,排序,增加,删除)

    #include <stdio.h>#include <stdlib.h> typedef struct NODE{ int data ; struct NODE * pNex ...

  6. JS调用函数的两种方式

    <script type="text/javascript"> window.onload = init; //onload 表示页面全部加载完毕后,再调用init() ...

  7. SpringBoot学习- 5、整合Redis

    SpringBoot学习足迹 SpringBoot项目中访问Redis主要有两种方式:JedisPool和RedisTemplate,本文使用JedisPool 1.pom.xml添加dependen ...

  8. hibernate跟Mybatis/ ibatis 的区别,为什么选择?(转)

    第一章 Hibernate与MyBatisHibernate 是当前最流行的O/R mapping框架,它出身于sf.NET,现在已经成为Jboss的一部分. Mybatis 是另外一种优秀的O/R ...

  9. Jquery 如何设置多个attr()属性

    Jquery 如何设置多个attr()属性?     文章来源:刘俊涛的博客 欢迎关注公众号.留言.评论,一起学习. _________________________________________ ...

  10. c#数据筛选和排序

    一.TreeView SelectedNode    选中的节点            Level    节点的深度(从0开始)                AfterSelect    节点选中后 ...