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 ...
随机推荐
- 练习2-15 求简单交错序列前N项和 (15 分)
练习2-15 求简单交错序列前N项和 (15 分) 本题要求编写程序,计算序列 1 - 1/4 + 1/7 - 1/10 + ... 的前N项之和. 输入格式: 输入在一行中给出一个正整数N. 输出格 ...
- javabst1an
(单选题)下列概念中不包括任何实现,与存储空间没有任何关系的是() A)类 B)接口 C)抽象类 D)对象 正确答案为:B解析:接口是一种只含有抽象方法或常量的一种特殊的抽象类,因为接口不包括任何实现 ...
- css:html-font-size
font-family:"Helvetica Neue",Helvetica,Arial,sans-serif
- Codeforces_842
A.枚举一个区间,判断是否有数符合. #include<bits/stdc++.h> using namespace std; long long l,r,x,y,k; int main( ...
- tensorflow variable scope 变量命名空间和变量共享
import tensorflow as tf def f(): var = tf.Variable(initial_value=tf.random_normal(shape=[2])) return ...
- Codeforces_801
A.直接暴力就行了,先把能组合的按线性组合掉,再枚举剩下相邻没用过的. #include<bits/stdc++.h> using namespace std; string s; ] = ...
- CCF_201612-3_炉石传说
http://115.28.138.223/view.page?gpid=T45 模拟. #include<iostream> #include<cstring> #inclu ...
- Altium Designer 14安装破解
Altium Designer 14简称AD14,是一款专业的PCB设计软件,利用他可以计出专业的PCB元件.Altium Designer 14.3.10是目前的最新版本. Altium Desig ...
- [Effective Java 读书笔记] 第6章 枚举和注解
第三十条 用enum代替int 总得来说,使用enum有几点好处 1.编译时的类型安全, 2.可以保证就是自己定义的值,不会有月结风险, 3.每个枚举类型有自己的命名空间 4.枚举可以添加任意的方法和 ...
- pytorch之 batch_train
import torch import torch.utils.data as Data torch.manual_seed(1) # reproducible BATCH_SIZE = 5 # BA ...