题意:有一个由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. 在vue中使用elementUI饿了么框架使用el-tabs,切换Tab如何实现实时加载,以及el-table表格使用总结

    当我们在开发中遇到tab切换,这时候用el的el-tabs感觉很方便 但当我在把代码都写完后,发现一个问题就是页面打开时 虽然我们只能看见当前一个tab页,但是vue会帮你把你写的所有tab页的内容都 ...

  2. 虚拟机win7 安装过程中遇到虚拟工具安装失败

    如果遇见这样的问题 倘若你用的是这样的镜像:cn_windows_7_enterprise_x64_dvd_x15-70741.iso 换镜像源.换镜像源.换镜像源! 换成带sp1的iso镜像:cn_ ...

  3. 3.获取某天的最大时间和最小时间,使用Calendar

    if (taxTraySummaryListDTO.getStartDate() != null) { Calendar cal = Calendar.getInstance(); cal.setTi ...

  4. INEQUALITY BOOKS

    来源:这里 Bất Đẳng Thức Luôn Có Một Sức Cuốn Hút Kinh Khủng, Một Số tài Liệu và Sách Bổ ích Cho Việc Học ...

  5. 利用Cadence PCB SI分析特性阻抗变化因素

    1.概要 在进行PCB SI的设计时,理解特性阻抗是非常重要的.这次,我们对特性阻抗进行基础说明之外,还说明Allegro的阻抗计算原理以及各参数和阻抗的关系. 2.什么是特性阻抗? 2.1 传送线路 ...

  6. 基于Linq表达式做的一个简单的表达式生成器

    using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; ...

  7. DoS攻击种类

    DoS攻击有许多种类,主要有Land攻击.死亡之ping.泪滴.Smurf攻击及SYN洪水等. 据统计,在所有黑客攻击事件中,syn洪水攻击是最常见又最容易被利用的一种DoS攻击手法. 1.攻击原理 ...

  8. 294. 翻转游戏 II

    题目: 链接:https://leetcode-cn.com/problems/flip-game-ii/ 你和朋友玩一个叫做「翻转游戏」的游戏,游戏规则:给定一个只有 + 和 - 的字符串.你和朋友 ...

  9. Myeclipse的一些快捷键整理(转)

    1. [ALT+/]    此快捷键为用户编辑的好帮手,能为用户提供内容的辅助,不要为记不全方法和属性名称犯愁,当记不全类.方法和属性的名字时,多体验一下[ALT+/]快捷键带来的好处吧.    2. ...

  10. 关于QImage和IplImage之间转换的实现

    在嵌入式系统中实现qt和opencv的处理,最基础的就是QImage和IplImage之间的转换.这样两者就可以进行一起使用图像数据,从而达到利用qt显示和利用opencv处理的功能. 下面我将贴出代 ...