BUPT2017 wintertraining(15) #8G

题意

给一个数组a,有n个数,m次操作。\(N, M ≤ 10^5, |A i| ≤ 10^9, 1 ≤ l ≤ r ≤ N, |d| ≤ 10^4\)

操作有四种,

C l r d:更新区间[l,r],值都加上d,并且时间前进1

Q l r:查询[l,r]的区间和

H l r t:查询t时刻的区间和

B t:回到t时刻(一定是历史时刻),且t时刻之后的操作都作废了。

题解

这道题的关键是怎么更新区间和。

本来线段树更新区间和要push down也就是把懒惰标记下移,但是这样,整个修改区间都需要新建线段树的节点,空间不够。

所以考虑在查询的时候传参数下去,也就是一路加上大区间的lazy值,这样就不用push down了。

代码

#include <cstdio>
#include <cstring>
#define N 100005
#define M (N*25)
typedef long long ll;
namespace PST{
int T[N],lson[M],rson[M],tot,n;
ll sum[M], lz[M];
void init(int _n){
tot=0;
n=_n;
memset(sum,0,sizeof sum);
memset(lz,0,sizeof lz);
}
void push_up(int root,int l,int r){
sum[root]=sum[lson[root]]+sum[rson[root]]+lz[root]*(r-l+1);
}
int build(int l,int r){
int root=++tot;
if(l==r){
scanf("%lld",sum+tot);
return tot;
}
int mid=l+r>>1;
lson[root]=build(l,mid);
rson[root]=build(mid+1,r);
push_up(root,l,r);
return root;
}
int update(int root,int l,int r,int L,int R,int val){
int newroot=++tot;
lson[newroot]=lson[root];
rson[newroot]=rson[root];
lz[newroot]=lz[root];
if(L<=l&&r<=R){
sum[newroot]=sum[root]+(ll)val*(r-l+1);
lz[newroot]+=val;
return newroot;
}
int mid=l+r>>1;
if(L<=mid)
lson[newroot]=update(lson[root],l,mid,L,R,val);
if(R>mid)
rson[newroot]=update(rson[root],mid+1,r,L,R,val);
push_up(newroot,l,r);
return newroot;
}
ll query(int root,int l,int r,int L,int R,ll add){
if(L<=l&&r<=R){
return sum[root]+(add)*(r-l+1);
}
int mid=l+r>>1;
ll ans=0;
if(L<=mid)
ans+=query(lson[root],l,mid,L,R,lz[root]+add);
if(R>mid)
ans+=query(rson[root],mid+1,r,L,R,lz[root]+add);
return ans;
}
}
int main(){
int n,m;
while(~scanf("%d%d",&n,&m)){
int now;
PST::init(n);
PST::T[now=0]=PST::build(1,n);
for(int i=0;i<m;++i){
char op;
int l,r,t,d;
scanf(" %c",&op);
if(op=='Q'){
scanf("%d%d",&l,&r);
printf("%lld\n",PST::query(PST::T[now],1,n,l,r,PST::lz[PST::T[now]]));
}else if(op=='H'){
scanf("%d%d%d",&l,&r,&t);
printf("%lld\n",PST::query(PST::T[t],1,n,l,r,PST::lz[PST::T[t]]));
}else if(op=='B'){
scanf("%d", &now);
PST::tot=PST::T[now+1]-1;
}else if(op=='C'){
scanf("%d%d%d",&l,&r,&d);
int tmp=now;
PST::T[++now]=PST::update(PST::T[tmp],1,n,l,r,d);
}
}
}
}

【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 (主席树)

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

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

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

  4. HDU 4348 To the moon 主席树

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

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

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

  6. HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  7. HDU 2665 Kth number(主席树静态区间第K大)题解

    题意:问你区间第k大是谁 思路:主席树就是可持久化线段树,他是由多个历史版本的权值线段树(不是普通线段树)组成的. 具体可以看q学姐的B站视频 代码: #include<cmath> #i ...

  8. hdu 3397 Sequence operation(线段树:区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意:给你一个长度为n的0,1序列,支持下列五种操作, 操作0(0 a b):将a到b这个区间的 ...

  9. HDU4348To the moon主席树,区间修改

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

随机推荐

  1. ZOJ - 1610 经典线段树染色问题

    这个是一个经典线段树染色问题,不过题目给的是左右左右坐标,即[0,3]包含0-1这一段 1-2这一段 2-3这一段,和传统的染色不太一样,不过其实也不用太着急. 我们把左边的坐标+1,即可,那么[0, ...

  2. openstack-云计算概述

    一.云计算 1.云计算解决的问题 备机准备(低配) 故障恢复 安装系统 硬件资源浪费 电力资源浪费 2.云计算概念 (1)维基百科 云计算是一种通过因特网以服务的方式提供动态可伸缩的虚拟化的资源的计算 ...

  3. 软件工程(FZU2015) 赛季得分榜,第六回合

    SE_FZU目录:1 2 3 4 5 6 7 8 9 10 11 12 13 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分=团队得分+个人贡献分 个人贡献分: 个人 ...

  4. java开发中使用枚举表述数据字典

    一.用枚举表述数据字典 1.代码: package com.inspire.jdk.caculate; /** * Created by yaming * 用枚举表述常量数据字段 */ public ...

  5. FAIL - Deploy Upload Failed, Exception: [org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (112503036) exceeds the configured

    Message:  FAIL - Deploy Upload Failed, Exception: [org.apache.tomcat.util.http.fileupload.FileUpload ...

  6. AngularJS基于模块化的MVC实现

    AngularJS基于模块化的MVC实现 <!DOCTYPE html> <html> <head> <meta charset="UTF-8&qu ...

  7. 谈谈B-树和B+树及其应用

    待更!!! B-树和B+树的应用:数据搜索和数据库索引 B+/-Tree原理及mysql的索引分析 从B树.B+树.B*树谈到R 树 B树.B-树.B+树.B*树

  8. 腾讯机试题 AcWing 603 打怪兽

    题目链接:https://www.acwing.com/problem/content/605/ 题目大意: 略 分析: 用dp[i][j]表示用j元钱能在前i只怪兽上所能贿赂到的最大武力值. 有一种 ...

  9. 使用Guava cache构建本地缓存

    前言 最近在一个项目中需要用到本地缓存,在网上调研后,发现谷歌的Guva提供的cache模块非常的不错.简单易上手的api:灵活强大的功能,再加上谷歌这块金字招牌,让我毫不犹豫的选择了它.仅以此博客记 ...

  10. Vue-router的API详解

    前面的话 本文将详细介绍Vue-router的API router-link <router-link> 组件支持用户在具有路由功能的应用中点击导航. 通过 to 属性指定目标地址,默认渲 ...