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.发展历史:历 ...
随机推荐
- Java版TicTacToe
MainFrame.java package com.bu_ish; import java.awt.BorderLayout; import java.awt.Color; import java. ...
- 配置tomcat,实现域名访问项目
首先,配置tomcat端口号为80,配置方法:配置tomcat,访问端口改为80 然后,配置访问项目时候,不用项目名,配置方法:配置tomcat,使访问项目时候无项目名 最后,配置tomcat的ser ...
- 大数据之ES系列——第一篇 ElasticSearch2.2 集群安装部署
第一部分 安装准备 准备三台主机节点: hc11.spads 192.168.160.181 hc12.spads 192.168.160.182 hc13.spads 192.168.160 ...
- 启动jmeter报错
启动jmeter.bat时报错
- bzoj 2155 Xor
题目大意: 求一条从$1 \rightarrow n$的路径是异或和最大 思路: 先随便求一棵生成树,然后求出所有环,对于所有环都可以去转一圈只取到这个环的贡献 那么就是线性基裸题了 #include ...
- Preface Numbering
链接 分析:先打表需要用到的罗马数字,然后暴力转换,最后统计一下即可 /* PROB:preface ID:wanghan LANG:C++ */ #include "iostream&qu ...
- MakeFile 文件的使用
什么是Makefile? 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译, ...
- ftp主要流程
判断是否是root用户,若不是则提示并退出. 建立server socket. 等待用户连接,并建立相应用户的子进程.
- java枚举类Enum方法简介(valueof,value,ordinal)
Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口. 当我们在声明一个enum类型时,我们应该注意到en ...
- 【225】ArcEngine 实现要素添加 & 删除
参考:ArcGIS Engine效率探究——要素的添加和删除.属性的读取和更新 删除要素 //添加图层,显示在最上面 axMapControl1.AddShapeFile(@"D:\01-业 ...