hdu4348 To the moon (可持久化线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4348
题目大意:给定含有n个数的序列,有以下四种操作
1.C l r d:表示对区间[l,r]中的数加上d,并且时间加1
2.Q l r:询问当前时间区间[l,r]的和
3.H l r t:询问时间t区间[l,r]的和
4.B t :时间回到t
Sample Input
55
9
15
0
1
解题思路:用线段树求区间和时可以不用把lazy标记下传,因为每次都下传的话消耗的空间会很大,很可能爆内存,我们可以直接在询问时,把当前区间的懒惰标记用一个参数传下去,然后找到要求和的区间时,直接把从上到下的懒惰标记累加和乘以区间长度再加上这段区间原本的和就可以了。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+;
struct node{
int l,r;
ll lazy,sum;
}tree[maxn*];
int n,m,t,cnt,root[maxn];
void pushup(int rt,int l,int r){
tree[rt].sum=tree[tree[rt].l].sum+tree[tree[rt].r].sum+tree[rt].lazy*(r-l+);
}
void build(int &rt,int l,int r){
rt=++cnt;
tree[rt].lazy=;
if(l==r){
scanf("%lld",&tree[rt].sum);
return;
}
int mid=(l+r)/;
build(tree[rt].l,l,mid);
build(tree[rt].r,mid+,r);
pushup(rt,l,r);
}
void update(int &now,int pre,int L,int R,int val,int l,int r){
now=++cnt,tree[now]=tree[pre];
if(L<=l&&R>=r){
tree[now].sum+=1ll*(r-l+)*val;
tree[now].lazy+=val;
return;
}
int mid=(l+r)/;
if(L<=mid) update(tree[now].l,tree[pre].l,L,R,val,l,mid);
if(R>mid) update(tree[now].r,tree[pre].r,L,R,val,mid+,r);
pushup(now,l,r);
}
ll query(int now,int L,int R,int lazy,int l,int r){
if(L<=l&&R>=r){
return tree[now].sum+1ll*(r-l+)*lazy;
}
int mid=(l+r)/; ll res=;
lazy+=tree[now].lazy;
if(mid>=L) res+=query(tree[now].l,L,R,lazy,l,mid);
if(mid<R) res+=query(tree[now].r,L,R,lazy,mid+,r);
return res;
}
int main(){
char op[];
scanf("%d%d",&n,&m);
build(root[],,n);
int l,r,val,T;
t=;
while(m--){
scanf("%s",op);
if(op[]=='C'){
scanf("%d%d%d",&l,&r,&val);
t++;
update(root[t],root[t-],l,r,val,,n);
}else if(op[]=='Q'){
scanf("%d%d",&l,&r);
printf("%lld\n",query(root[t],l,r,,,n));
}else if(op[]=='H'){
scanf("%d%d%d",&l,&r,&T);
printf("%lld\n",query(root[T],l,r,,,n));
}else if(op[]=='B'){
scanf("%d",&t);
}
}
return ;
}
hdu4348 To the moon (可持久化线段树)的更多相关文章
- hdu4348 - To the moon 可持久化线段树 区间修改 离线处理
法一:暴力! 让干什么就干什么,那么久需要可持久化线段树了. 但是空间好紧.怎么破? 不down标记好了! 每个点维护sum和add两个信息,sum是这段真实的和,add是这段整体加了多少,如果这段区 ...
- HDU 4348 To the moon 可持久化线段树,有时间戳的区间更新,区间求和
To the moonTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.a ...
- 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 ...
- HDU 4348 To the moon 可持久化线段树
To the moon Problem Description BackgroundTo The Moon is a independent game released in November 201 ...
- HDU 4348 To the moon(可持久化线段树)
To the moon Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tota ...
- 洛谷——P3919 【模板】可持久化数组(可持久化线段树/平衡树)
P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...
- [学习笔记] 可持久化线段树&主席树
众所周知,线段树是一个非常好用也好写的数据结构, 因此,我们今天的前置技能:线段树. 然而,可持久化到底是什么东西? 别急,我们一步一步来... step 1 首先,一道简化的模型: 给定一个长度为\ ...
- PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
#44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...
- 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ...
随机推荐
- XXX is not a function
今天,一个以前的小伙伴跟我说他遇到了一个问题,调试了将近两天(这家伙一开始不打算干程序员,跑去干了两个月销售,现在又想回来写代码了,所以就自己折腾一个demo,免得面试的时候被问住) 我把他的代码从头 ...
- C# 很久以前几个常用类
Base64加密解密 using System; using System.Collections.Generic; using System.Linq; using System.Text; nam ...
- UNR#3 Day1——[ 堆+ST表+复杂度分析 ][ 结论 ][ 线段树合并 ]
地址:http://uoj.ac/contest/45 第一题是鸽子固定器. 只会10分.按 s 从小到大排序,然后 dp[ i ][ j ][ k ] 表示前 i 个元素.已经选了 j 个.最小值所 ...
- Spring Cloud架构教程 (五)服务网关(过滤器)
过滤器的作用 通过上面所述的两篇我们,我们已经能够实现请求的路由功能,所以我们的微服务应用提供的接口就可以通过统一的API网关入口被客户端访问到了.但是,每个客户端用户请求微服务应用提供的接口时,它们 ...
- WinSetupFromUSB - 超简单制作多合一系统安装启动U盘的工具 (支持Win/PE/Linux启动盘)
很多同学都喜欢将电脑凌乱不堪的系统彻底重装以获得一个"全新的开始",但你会发现如今很多电脑都已经没有光驱了,因此制作一个U盘版的系统安装启动盘备用是非常必要的. 我们之前推荐过 I ...
- Xcode工程文件pbxproj
Xcode工程文件pbxproj Xcode会去读Project.pbxproj文件,把pbxproj转成plist文件,看起根目录结构 rootObject:指向的是我们的工程对象.(对应一个24个 ...
- windows编程,消息函数中拦截消息的问题
很多年没有写windows窗口程序了,今天自制基于vulkan的程序时遇到了一些问题,部分代码如下: LRESULT CALLBACK XWindow::WndProc(HWND hWnd, UINT ...
- Linux内核调试方法总结之ltrace
ltrace [用途] 库文件调用跟踪器,Linux内核内建命令,用法类似strace [命令格式] [参数说明][详细说明参考man ltrace帮助文档] -D 打印调试信息 01-DEBUG_G ...
- ORACLE异机增量备份恢复
PROD异机增量备份恢复验证实施文档 准备工作:source 源库:PROD数据库备份策略:周日0级RMAN备份,周一至周六1级差异增量备份0 4 * * 0 /data/rmanlev0.sh &g ...
- easyui表格适应bootstrap
.panel1 { overflow: hidden; text-align: left; margin:; border:; -moz-border-radius: 0 0 0 0; -webkit ...