传送门

查询历史版本,回到历史版本,这个题目显然是用主席树,好像就没了!

但是这里的修改是区间修改,众所周知主席树的空间复杂度是\(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的更多相关文章

  1. SP11470 TTM - To the moon[主席树标记永久化]

    SP11470 TTM - To the moon C l r d:区间 \([L,R]\) 中的数都加 d ,同时当前的时间戳加 1. Q l r:查询当前时间戳区间 \([L,R]\) 中所有数的 ...

  2. 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 ...

  3. SP11470 TTM - To the moon

    嘟嘟嘟 主席树+区间修改. 以为是水题,写着写着发现区间修改标记下传会出问题,然后想了想发现以前做的只是单点修改. 那怎么办咧? 然后题解交了我标记永久化这个神奇的东西. 特别好理解,就是修改的时候直 ...

  4. 2018.08.04 spoj TTM to the moon(主席树)

    spoj传送门 vjudge传送门 主席树板子题. 支持历史版本的区间和,区间和,区间修改和时光倒流. 其中新奇一点的也只有区间修改了,这个东西直接标记永久化就行了. 如果想下传标记的话也行,需要在p ...

  5. 「SP11470」TTM - To the moon

    题目描述 给定一段长度为 \(N\) 的序列 \(a\) 以及 \(M\) 次操作,操作有以下几种: C l r d :将区间 \([l,r]\) 中的数都加上 \(d\) Q l r :查询当前时间 ...

  6. 洛谷——P3919 【模板】可持久化数组(可持久化线段树/平衡树)

    P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...

  7. [学习笔记] 可持久化线段树&主席树

    众所周知,线段树是一个非常好用也好写的数据结构, 因此,我们今天的前置技能:线段树. 然而,可持久化到底是什么东西? 别急,我们一步一步来... step 1 首先,一道简化的模型: 给定一个长度为\ ...

  8. 「SPOJ TTM 」To the moon「标记永久化」

    题意 概括为主席树区间加区间询问 题解 记录一下标记永久化的方法.每个点存add和sum两个标记,表示这个区间整个加多少,区间和是多少(这个区间和不包括祖先结点区间加) 然后区间加的时候,给路上每结点 ...

  9. Moon.Orm 入门总指南

    注意:下面的pdf文件强烈建议下载或在线查看 1)旗舰版帮助文档点击查看或下载 2)http://pan.baidu.com/s/1hq7krFu(新手手册下载)(强烈推荐) 3)性能及规范下载,网友 ...

  10. Moon.Orm 常见查询实例

    一.Moon.Orm框架总述 (您还用hibernate?实体框架?) 1.框架名:Moon 意思是月亮,而非Mono.因为很喜欢明月,所以以此为名.它是一个.NET下的Orm框架. 2.发展历史:历 ...

随机推荐

  1. 超实用的 Nginx 极简教程,覆盖了常用场景(转)

    概述 安装与使用 安装 使用 nginx 配置实战 http 反向代理配置 负载均衡配置 网站有多个 webapp 的配置 https 反向代理配置 静态站点配置 搭建文件服务器 跨域解决方案 参考 ...

  2. Linux环境下安装ActiveMq

    一.准备安装的tar包 1.将安装包放在服务器上:apache-activemq-5.10.2.tar.gz 2.将安装包解压:tar -zxvf apache-activemq-5.10.2.tar ...

  3. Srvctl命令具体解释(10g)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/lovedieya/article/details/28169481 Srvctl命令   Srvct ...

  4. for(String s:list)的运行

    源码 List<String> list = new ArrayList<>(); for (String s:list){ } class文件 List<String& ...

  5. Javascript高级程序设计笔记(很重要尤其是对象的设计模式与继承)

    var obj = {'a':'a'}; var fun = function (){} console.log(typeof obj);//object console.log(typeof fun ...

  6. Android Weekly Notes Issue #246

    Android Weekly Issue #246 February 26th, 2017 Android Weekly Issue #246 本期内容包括: RecyclerView上的Shared ...

  7. JavaSE基础练习IO,字符串,循环

    import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.F ...

  8. python学习笔记:第一天

    1.经典程序测试:hello world 入门编程语言第一件事,先写hello world. #!/usr/bin/env python# -*- coding: UTF-8 -*- print(&q ...

  9. Tensorflow深度学习之十二:基础图像处理之二

    Tensorflow深度学习之十二:基础图像处理之二 from:https://blog.csdn.net/davincil/article/details/76598474   首先放出原始图像: ...

  10. easyui tree 树形节点 formatter 渲染不起作用

    接了个需求,需要对一个树形列表进行重新渲染,在进行渲染的过程中发现树形节点的formatter 属性无法生效.经反复测试,发现在外部环境中正常,但在项目环境中始终无效.最终发现问题出在 easyui ...