SP11470 TTM - To the moon[主席树标记永久化]
C l r d:区间 \([L,R]\) 中的数都加 d ,同时当前的时间戳加 1。
Q l r:查询当前时间戳区间 \([L,R]\) 中所有数的和 。
H l r t:查询时间戳 \(t\) 区间 \([L,R]\) 的和 。
B t:将当前时间戳置为 \(t\)
每次记下版本 \(times\)
保留标记…每次标记的时候直接加上\(tag_p\) 即可
#include <bits/stdc++.h>
#define ls(x) ch[x][0]
#define rs(x) ch[x][1]
#define rep(i , j , k) for(int i = j ; i <= k ; i ++)
#define Rep(i , j , k) for(int i = j ; i >= k ; i --)
using namespace std ;
using ll = long long ;
using pii = pair <int , int> ;
using vii = vector <int> ;
#define int long long
auto ot = [&]() { cerr << "ATS TXDY" << '\n' ; int ATS_nantf_txdy = true ; } ;
auto _ios = [&]() { ios :: sync_with_stdio(false) ; cin.tie(nullptr) ; cout.tie(nullptr) ; } ;
namespace stO_ATS_Orz {
template < class T > void cmax(T & x , T y) { if(x < y) x = y ; }
template < class T > void cmin(T & x , T y) { if(x > y) x = y ; }
template < class T > void abs(T x) { if(x < 0) x = -x ; }
const int N = 1e5 + 10 ;
int n , m ;
int a[N] , cnt = 0 ;
int rt[N] , tag[N * 50] , sum[N * 50] ;
int ls[N * 50] , rs[N * 50] ;
void build(int l , int r , int & p) {
p = ++ cnt ;
if(l == r) { sum[p] = a[l] ; return ; }
int mid = l + r >> 1 ;
build(l , mid , ls[p]) ;
build(mid + 1 , r , rs[p]) ;
sum[p] = sum[ls[p]] + sum[rs[p]] ;
}
void change(int a , int b , int l , int r , int pre , int & p , int val) {
tag[p = ++ cnt] = tag[pre] ; sum[p] = sum[pre] + 1ll * (min(b , r) - max(a , l) + 1) * val ;
if(a <= l && r <= b) { tag[p] += val ; ls[p] = ls[pre] ; rs[p] = rs[pre] ; return ; }
int mid = l + r >> 1 ;
if(a <= mid) change(a , b , l , mid , ls[pre] , ls[p] , val) ;
else ls[p] = ls[pre] ;
if(b > mid) change(a , b , mid + 1 , r , rs[pre] , rs[p] , val) ;
else rs[p] = rs[pre] ;
}
int query(int a , int b , int l , int r , int p) {
if(a <= l && r <= b) { return sum[p] ; }
int mid = l + r >> 1 , ans = 0 ;
if(a <= mid) ans += query(a , b , l , mid , ls[p]) ;
if(b > mid) ans += query(a , b , mid + 1 , r , rs[p]) ;
ans += 1ll * tag[p] * (min(b , r) - max(a , l) + 1) ;
return ans ;
}
void main() {
cin >> n >> m ; rep(i , 1 , n) cin >> a[i] ;
build(1 , n , rt[0]) ;
int times = 0 ;
rep(i , 1 , m) {
char c ; cin >> c ;
if(c == 'C') {
int l , r , d ;
cin >> l >> r >> d ; times ++ ;
change(l , r , 1 , n , rt[times - 1] , rt[times] , d) ;
}
if(c == 'Q') {
int l , r ; cin >> l >> r ;
cout << query(l , r , 1 , n , rt[times]) << '\n' ;
}
if(c == 'H') {
int l , r , t ; cin >> l >> r >> t ;
cout << query(l , r , 1 , n , rt[t]) << '\n' ;
}
if(c == 'B') {
int t ; cin >> t ; times = t ;
}
}
}
}
signed main() {
_ios() ; ot() ;
return stO_ATS_Orz :: main() , 0 ;
}
SP11470 TTM - To the moon[主席树标记永久化]的更多相关文章
- [HDU4348]To the moon(主席树+标记永久化)
学可持久化treap的时候才发现自己竟然没写过需要标记下传的主席树,然而现在发现大部分操作都可以标记永久化,下传会增大占用空间. 这题一种写法是和普通的线段树一样标记下传,注意所有修改操作(包括put ...
- Codeforces 258E - Little Elephant and Tree(根号暴力/线段树+标记永久化/主席树+标记永久化/普通线段树/可撤销线段树,hot tea)
Codeforces 题目传送门 & 洛谷题目传送门 yyq:"hot tea 不常有,做过了就不能再错过了" 似乎这是半年前某场 hb 模拟赛的 T2?当时 ycx.ym ...
- [HNOI2015]开店(树剖+主席树+标记永久化)
听说正解点分树?我不会就对了 此题是 \([LNOI2014]LCA\) 强化版,也是差分一下,转化为区间加区间和 不过权值有大小要求,那么我们按照权值排序,依次加入主席树,询问的时候 \(lower ...
- HDU 4348(主席树 标记永久化)
题面一看就是裸的数据结构题,而且一看就知道是主席树... 一共四种操作:1:把区间[l, r]的数都加上d,并且更新时间.2:查询当前时间的区间和.3:查询历史时间的区间和.4:时光倒流到某个时间. ...
- hdu4348区间更新的主席树+标记永久化
http://acm.hdu.edu.cn/showproblem.php?pid=4348 sb的标记永久化即可,刚开始add和sum没复制过来wa了两发...,操作和原来的都一样,出来单点变成区间 ...
- BZOJ4785 [Zjoi2017]树状数组 【二维线段树 + 标记永久化】
题目链接 BZOJ4785 题解 肝了一个下午QAQ没写过二维线段树还是很难受 首先题目中的树状数组实际维护的是后缀和,这一点凭分析或经验或手模观察可以得出 在\(\mod 2\)意义下,我们实际求出 ...
- hdu4348 To the moon (主席树 || 离线线段树)
Problem Description Background To The Moon is a independent game released in November 2011, it is a ...
- SP11470 TTM - To the moon
嘟嘟嘟 主席树+区间修改. 以为是水题,写着写着发现区间修改标记下传会出问题,然后想了想发现以前做的只是单点修改. 那怎么办咧? 然后题解交了我标记永久化这个神奇的东西. 特别好理解,就是修改的时候直 ...
- hdu 4348 To the moon (主席树区间更新)
传送门 题意: 一个长度为n的数组,4种操作 : (1)C l r d:区间[l,r]中的数都加1,同时当前的时间戳加1 . (2)Q l r:查询当前时间戳区间[l,r]中所有数的和 . (3)H ...
随机推荐
- linux下面误删root里面的文件夹 恢复方法
手残吧 /root/ 里面的文件删除了. .mkdir /root cp -a /etc/skel/.[!.]* /root 主要是吧 /etc/skel/里面的文件拷贝回去就行了~~~哈.. 转自: ...
- 7天用Go动手写/从零实现Web框架Gee
设计一个框架 大部分时候,我们需要实现一个 Web 应用,第一反应是应该使用哪个框架.不同的框架设计理念和提供的功能有很大的差别.比如 Python 语言的 django和flask,前者大而全,后者 ...
- LeetCode.509——斐波那契数
问题描述: 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0, F(1) = 1 F(N) ...
- oracle面试基础
. 对于一个存在系统性能的系统,说出你的诊断处理思路 ). 做statspack收集系统相关信息 了解系统大致情况/确定是否存在参数设置不合适的地方/查看top event/查看top sql等 ). ...
- vue 插槽 ------ slot 简单理解
solt 插槽 内容分发 什么是插槽 Vue 实现了一套内容分发的 API,将 `` 元素作为承载分发内容的出口. 插槽显示的位置却由子组件自身决定,槽写在组件模板的什么位置,父组件传过来的模板将来就 ...
- 《C语言》—— 数组详解
书籍使我变成了一个幸福的人,使我的生活变成轻松而舒适的诗.--高尔基 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues. https://github.com/midou-tec ...
- redis说明及部署
一.reids 概述 redis全称REmote DIctionary Server.一个基于KV的持久化分布式数据库.所编写的语言为C.与另一个分布式缓存Memcached有几分相似 但是redis ...
- P3387缩点(tarjan+拓扑排序+线性dp)
题目描述 给定一个 n个点 m 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 输入 ...
- qt creator源码全方面分析(2-10-1)
目录 Getting and Building Qt Creator 获取Qt 获取和构建Qt Creator Getting and Building Qt Creator 待办事项:应该对此进行扩 ...
- pytorch ---神经网络语言模型 NNLM 《A Neural Probabilistic Language Model》
论文地址:http://www.iro.umontreal.ca/~vincentp/Publications/lm_jmlr.pdf 论文给出了NNLM的框架图: 针对论文,实现代码如下: # -* ...