TTM-To the moon
传送门
查询历史版本,回到历史版本,这个题目显然是用主席树,好像就没了!
但是这里的修改是区间修改,众所周知主席树的空间复杂度是\(nlog(n)\)的,区间修改会导致主席树的开点到达一个相当恐怖的数量(具体是因为传标记会导致新开许多节点),空间复杂度最坏可以被炸成\(O(n^2)\)。
记得以前学过的线段树标记永久化吗?
只要修改根到需要修改的区间这段路径上的权值,然后在包含的区间上打上标记就可以了(说得不好请见谅,可以自行学习标记永久化)
我居然把修改区间的包含点数的分类讨论写挂了(改了1个多小时。。)
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
void read(int &x) {
char ch; bool ok;
for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1;
for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x;
}
const int maxn=2e5+1;char p[3];
int cnt,n,m,tag[maxn*20],id,rt[maxn],d[maxn],tot,now,ff[maxn],ls[maxn*20],rs[maxn*20],val[maxn*20];
#define rg register
void update(int x){val[x]=val[ls[x]]+val[rs[x]];}
void build(int &k,int l,int r)
{
k=++id;
if(l==r){val[k]=d[l];return ;}
int mid=(l+r)>>1;
build(ls[k],l,mid),build(rs[k],mid+1,r);
update(k);
}
void change(int x,int &k,int l,int r,int a,int b,int c)
{
k=++id,ls[k]=ls[x],rs[k]=rs[x],val[k]=val[x]+c*(min(r,b)-max(l,a)+1),tag[k]=tag[x];
if(a<=l&&b>=r){tag[k]+=c;return ;}
int mid=(l+r)>>1;
if(a<=mid)change(ls[x],ls[k],l,mid,a,b,c);
if(b>mid)change(rs[x],rs[k],mid+1,r,a,b,c);
}
int get(int x,int l,int r,int a,int b,int v)
{
if(a<=l&&b>=r)return val[x]+v*(r-l+1);
int mid=(l+r)>>1,ans=0;
if(a<=mid)ans+=get(ls[x],l,mid,a,b,v+tag[x]);
if(b>mid)ans+=get(rs[x],mid+1,r,a,b,v+tag[x]);
return ans;
}
signed main()
{
read(n),read(m);
for(rg int i=1;i<=n;i++)read(d[i]);
build(rt[0],1,n);
for(rg int i=1,x,y,z;i<=m;i++)
{
scanf("%s",p+1);
if(p[1]=='C')read(x),read(y),read(z),change(rt[now],rt[now+1],1,n,x,y,z),now++;
if(p[1]=='Q')read(x),read(y),printf("%lld\n",get(rt[now],1,n,x,y,0));
if(p[1]=='H')read(x),read(y),read(z),printf("%lld\n",get(rt[z],1,n,x,y,0));
if(p[1]=='B')read(x),now=x;
}
}
TTM-To the moon的更多相关文章
- SP11470 TTM - To the moon[主席树标记永久化]
SP11470 TTM - To the moon C l r d:区间 \([L,R]\) 中的数都加 d ,同时当前的时间戳加 1. Q l r:查询当前时间戳区间 \([L,R]\) 中所有数的 ...
- 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 ...
- SP11470 TTM - To the moon
嘟嘟嘟 主席树+区间修改. 以为是水题,写着写着发现区间修改标记下传会出问题,然后想了想发现以前做的只是单点修改. 那怎么办咧? 然后题解交了我标记永久化这个神奇的东西. 特别好理解,就是修改的时候直 ...
- 2018.08.04 spoj TTM to the moon(主席树)
spoj传送门 vjudge传送门 主席树板子题. 支持历史版本的区间和,区间和,区间修改和时光倒流. 其中新奇一点的也只有区间修改了,这个东西直接标记永久化就行了. 如果想下传标记的话也行,需要在p ...
- 「SP11470」TTM - To the moon
题目描述 给定一段长度为 \(N\) 的序列 \(a\) 以及 \(M\) 次操作,操作有以下几种: C l r d :将区间 \([l,r]\) 中的数都加上 \(d\) Q l r :查询当前时间 ...
- 洛谷——P3919 【模板】可持久化数组(可持久化线段树/平衡树)
P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...
- [学习笔记] 可持久化线段树&主席树
众所周知,线段树是一个非常好用也好写的数据结构, 因此,我们今天的前置技能:线段树. 然而,可持久化到底是什么东西? 别急,我们一步一步来... step 1 首先,一道简化的模型: 给定一个长度为\ ...
- 「SPOJ TTM 」To the moon「标记永久化」
题意 概括为主席树区间加区间询问 题解 记录一下标记永久化的方法.每个点存add和sum两个标记,表示这个区间整个加多少,区间和是多少(这个区间和不包括祖先结点区间加) 然后区间加的时候,给路上每结点 ...
- Moon.Orm 入门总指南
注意:下面的pdf文件强烈建议下载或在线查看 1)旗舰版帮助文档点击查看或下载 2)http://pan.baidu.com/s/1hq7krFu(新手手册下载)(强烈推荐) 3)性能及规范下载,网友 ...
- Moon.Orm 常见查询实例
一.Moon.Orm框架总述 (您还用hibernate?实体框架?) 1.框架名:Moon 意思是月亮,而非Mono.因为很喜欢明月,所以以此为名.它是一个.NET下的Orm框架. 2.发展历史:历 ...
随机推荐
- cocos2d-js v3事件管理器
总概: 1.时间监听器(cc.EventListener)封装用户的事件处理逻辑. 2.事件管理器(cc.eventManager)管理用户注册的事件监听器. 3.事件对象(cc.Event)包含事件 ...
- ssh服务配置文件---sshd_config详解
关于 SSH Server 的整体设定,包含使用的 port 啦,以及使用的密码演算方式 Port 22 # SSH 预设使用 22 这个 port,您也可以使用多的 port ! # 亦即重复使 ...
- javascript学习的思维导图
今天逛师父的博客园,发现了好东西~~~~我给偷过来了~~~那就是javascript学习的思维导图,比自己整理更快速. 思维导图小tips: 思维导图又叫心智图,是表达发射性思维的有效的图形思维工具 ...
- html5--3.16 button元素
html5--3.16 button元素 学习要点 掌握button元素的使用 button元素 用来建立一个按钮从功能上来说,与input元素建立的按钮相同 button元素是双标签,其内部可以配置 ...
- 调试windows服务最简单的方法之一
先看一下这段启动代码: using System; using System.Collections.Generic; using System.Linq; using System.ServiceP ...
- bzoj1556 (DP)
bzoj 1556 点这里打开题目 题目是求 a^2 求和: 原问题可以转化为:两个人在玩这个东西,问这两个人弄出来的序列相同的有多少种情况,操作方式不同即为一种不同的情况. 就这个问题,参考大佬的D ...
- c/c++生成预编译文件
Preprocesses C and C++ source files and writes the preprocessed output to a file. /P Remarks The f ...
- 一:MetaMq集群中单个节点的安装配置示意图
MetaMQ集群一个节点的安装和配置示意图[1]:下载metaMQ的安装包
- JAVA THINGKING (一)
保存数据位置: (1) 寄存器.这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部. (2) 堆栈.驻留于常规RAM(随机访问存储器)区域,这是一种特别快.特别有效的数据保存方式, ...
- 将List<T>集合用DataGridView展示
一.若要将List<T>集合的值赋值给DataGridView,首先要DataGridView中的列的DataPropertyName的值要和此集合的T类型的属性字段的名称,类型一致,并且 ...