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[主席树标记永久化]的更多相关文章

  1. [HDU4348]To the moon(主席树+标记永久化)

    学可持久化treap的时候才发现自己竟然没写过需要标记下传的主席树,然而现在发现大部分操作都可以标记永久化,下传会增大占用空间. 这题一种写法是和普通的线段树一样标记下传,注意所有修改操作(包括put ...

  2. Codeforces 258E - Little Elephant and Tree(根号暴力/线段树+标记永久化/主席树+标记永久化/普通线段树/可撤销线段树,hot tea)

    Codeforces 题目传送门 & 洛谷题目传送门 yyq:"hot tea 不常有,做过了就不能再错过了" 似乎这是半年前某场 hb 模拟赛的 T2?当时 ycx.ym ...

  3. [HNOI2015]开店(树剖+主席树+标记永久化)

    听说正解点分树?我不会就对了 此题是 \([LNOI2014]LCA\) 强化版,也是差分一下,转化为区间加区间和 不过权值有大小要求,那么我们按照权值排序,依次加入主席树,询问的时候 \(lower ...

  4. HDU 4348(主席树 标记永久化)

    题面一看就是裸的数据结构题,而且一看就知道是主席树... 一共四种操作:1:把区间[l, r]的数都加上d,并且更新时间.2:查询当前时间的区间和.3:查询历史时间的区间和.4:时光倒流到某个时间. ...

  5. hdu4348区间更新的主席树+标记永久化

    http://acm.hdu.edu.cn/showproblem.php?pid=4348 sb的标记永久化即可,刚开始add和sum没复制过来wa了两发...,操作和原来的都一样,出来单点变成区间 ...

  6. BZOJ4785 [Zjoi2017]树状数组 【二维线段树 + 标记永久化】

    题目链接 BZOJ4785 题解 肝了一个下午QAQ没写过二维线段树还是很难受 首先题目中的树状数组实际维护的是后缀和,这一点凭分析或经验或手模观察可以得出 在\(\mod 2\)意义下,我们实际求出 ...

  7. hdu4348 To the moon (主席树 || 离线线段树)

    Problem Description Background To The Moon is a independent game released in November 2011, it is a ...

  8. SP11470 TTM - To the moon

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

  9. hdu 4348 To the moon (主席树区间更新)

    传送门 题意: 一个长度为n的数组,4种操作 : (1)C l r d:区间[l,r]中的数都加1,同时当前的时间戳加1 . (2)Q l r:查询当前时间戳区间[l,r]中所有数的和 . (3)H ...

随机推荐

  1. asp.net core 2.2升到3.1遇到的问题小记

    趁着武汉疫情,在家研究原来2.2的框架升级到3.1的问题,在过程中遇到不少坑,好在放假有的是时间,一个一个解决,现做个简要记录,供大家参考.推荐认真看这篇文章 [https://docs.micros ...

  2. 并发队列之DelayQueue

    已经说了四个并发队列了,DelayQueue这是最后一个,这是一个无界阻塞延迟队列,底层基于前面说过的PriorityBlockingQueue实现的 ,队列中每个元素都有过期时间,当从队列获取元素时 ...

  3. LESS 用法入门

    本文旨在加深对 LESS 的理解和记忆,供自己开发时参考.相信对没有接触过 LESS 的程序员还是有用的,大佬绕路. 一. 安装和使用 LESS 1.1 安装 使用命令行安装 LESS npm ins ...

  4. python中更人性化的一个单元测试框架:nose2

    如果你学过 python 进行自动化测试,你一定使用过 unittest.今天我们要讲的 nose2 是一个高级版本的 unittest.他比 unittest 更容易理解,用起来也更加方便一些. 快 ...

  5. HDU 3068 最长回文 (Manacher最长回文串)

    Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等   Input 输 ...

  6. throw throws区别

    1.throws是在方法上对一个方法进行声明,而不进行处理,向上传,谁调用谁处理: 格式: 权限修饰符 返回值类型 方法名(参数列表) throws Exception1,Exception2...{ ...

  7. MySql Docker的一些操作方法

    偶尔有需求,涉及到数据库的改动,那一定要表结构改动.程序调试都先在测试环境淬炼千百遍. 现在流行微服务.docker部署,很容易拉起一整套环境. Compose File Demo mysql: im ...

  8. Linux系统之LVS+Keepalived实现

    1.简述lvs四种集群特点及使用场景 LVS集群有4种类型,分别是NAT.DR.TUN.FULLNAT 从工作方式来讲,NAT和FULLNAT都要修改请求报文的目标IP和目标端口(NAT)或源IP目标 ...

  9. 算法将一个对象中的某一个key值变为true,其他值都为false

    主要运用在,v-if v-show切换不同内容时,非常快的打开某一个区域,关闭其他的区域哈. 这样就不需要每一个设置false,打开区域设置为true. 可以优化代码哈 for in 主要循环对象(空 ...

  10. 【大白话系列】MySQL 学习总结 之 COMPACT 行格式的设计原理

    如果大家对我的 [大白话系列]MySQL 学习总结系列 感兴趣的话,可以点击关注一波. 一.回顾 MySQL 学习总结系列至此已经第七节了. 从大方向:我们已经学习了 MySQL 的架构设计.Inno ...