hdu4348区间更新的主席树+标记永久化
http://acm.hdu.edu.cn/showproblem.php?pid=4348
sb的标记永久化即可,刚开始add和sum没复制过来wa了两发。。。,操作和原来的都一样,出来单点变成区间,还要加一个标记永久化,这样就不用pushdown新加节点而爆内存了
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define C 0.5772156649
//#define ls l,m,rt<<1
//#define rs m+1,r,rt<<1|1
#define pil pair<int,ll>
#define pii pair<int,int>
#define ull unsigned long long
#define base 1000000000000000000
#define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f3f; int rt[N],tot,ls[N*],rs[N*];
ll sum[N*],add[N*];
void build(int &o,int l,int r)
{
o=++tot;
add[o]=;
if(l==r)
{
scanf("%lld",&sum[o]);
return ;
}
int m=(l+r)>>;
build(ls[o],l,m);
build(rs[o],m+,r);
sum[o]=sum[ls[o]]+sum[rs[o]];
// printf("%d+++%d+++%d+++%lld+++%d\n",l,r,o,sum[o],add[o]);
}
void update(int &o,int l,int r,int last,int L,int R,int x)
{
o=++tot;
ls[o]=ls[last];
rs[o]=rs[last];
sum[o]=sum[last];
add[o]=add[last];
if(L<=l&&r<=R)
{
add[o]+=x;
return ;
}
int m=(l+r)>>;
if(L<=m)update(ls[o],l,m,ls[last],L,R,x);
if(m<R)update(rs[o],m+,r,rs[last],L,R,x);
sum[o]=sum[ls[o]]+add[ls[o]]*(m-l+)+sum[rs[o]]+add[rs[o]]*(r-m);
// printf("%d %d %lld %lld\n",ls[o],rs[o],sum[ls[o]],sum[rs[o]]);
// printf("%d+++%d+++%d+++%lld+++%d\n",l,r,o,sum[o],add[o]);
}
ll query(int o,ll ad,int l,int r,int L,int R)
{
// printf("%d %d %d %lld\n",l,r,o,ad);
if(L<=l&&r<=R)
return (ad+add[o])*(r-l+)+sum[o];
ll ans=;
int m=(l+r)>>;
if(L<=m)ans+=query(ls[o],ad+add[o],l,m,L,R);
if(m<R)ans+=query(rs[o],ad+add[o],m+,r,L,R);
return ans;
}
char s[];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
build(rt[],,n);
int cnt=;
while(m--)
{
scanf("%s",s);
if(s[]=='Q')
{
int l,r;
scanf("%d%d",&l,&r);
printf("%lld\n",query(rt[cnt],,,n,l,r));
}
else if(s[]=='C')
{
cnt++;
int l,r,c;
scanf("%d%d%d",&l,&r,&c);
update(rt[cnt],,n,rt[cnt-],l,r,c);
}
else if(s[]=='H')
{
int l,r,c;
scanf("%d%d%d",&l,&r,&c);
printf("%lld\n",query(rt[c],,,n,l,r));
}
else scanf("%d",&cnt);
}
}
return ;
}
/********************
10 5
1 2 3 4 5 6 7 8 9 10
Q 2 4
C 3 6 3
Q 2 4
********************/
hdu4348区间更新的主席树+标记永久化的更多相关文章
- [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:时光倒流到某个时间. ...
- SP11470 TTM - To the moon[主席树标记永久化]
SP11470 TTM - To the moon C l r d:区间 \([L,R]\) 中的数都加 d ,同时当前的时间戳加 1. Q l r:查询当前时间戳区间 \([L,R]\) 中所有数的 ...
- BZOJ4785 [Zjoi2017]树状数组 【二维线段树 + 标记永久化】
题目链接 BZOJ4785 题解 肝了一个下午QAQ没写过二维线段树还是很难受 首先题目中的树状数组实际维护的是后缀和,这一点凭分析或经验或手模观察可以得出 在\(\mod 2\)意义下,我们实际求出 ...
- 线段树:CDOJ1597-An easy problem C(区间更新的线段树)
An easy problem C Time Limit: 4000/2000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...
- 【BZOJ3110】K大数查询(权值线段树套线段树+标记永久化,整体二分)
题意:有N个位置,M个操作.操作有两种,每次操作 如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是 ...
- hdu4348 To the moon (主席树 || 离线线段树)
Problem Description Background To The Moon is a independent game released in November 2011, it is a ...
随机推荐
- BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶
BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...
- 使用Redis的五个注意事项(命名)
原文:使用Redis的五个注意事项 下面内容来源于Quora上的一个提问,问题是使用Redis需要避免的五个问题.而回答中超出了五个问题的范畴,描述了五个使用Redis的注意事项.如果你在使用或者考虑 ...
- JS-排序详解:冒泡排序、选择排序和快速排序
JS-排序详解-冒泡排序 说明 时间复杂度指的是一个算法执行所耗费的时间 空间复杂度指运行完一个程序所需内存的大小 稳定指,如果a=b,a在b的前面,排序后a仍然在b的前面 不稳定指,如果a=b,a在 ...
- mysql什么情况下使用索引
表的主关键字 自动建立唯一索引 如zl_yhjbqk(用户基本情况)中的hbs_bh(户标识编号) 表的字段唯一约束 ORACLE利用索引来保证数据的完整性 如lc_hj(流程环节)中的lc_bh+h ...
- 我的Android进阶之旅------>解决:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
错误描述 今天在Android Studio项目中加入了jackson的开发包,编译运行时候,引发了如下的错误: Error:Execution failed for task ':app:trans ...
- Android Paint setXfermode
背景: dst 前景: src PorterDuff.Mode.CLEAR 清除画布上图像 PorterDuff.Mode.XOR 取两层图像的非交集部门 PorterDuff.Mo ...
- 008-查看JVM参数及值的命令行工具
1. HotSpot vm中的各个globals.hpp文件 查看jvm初始的默认值及参数 globals.hpp globals_extension.hpp c1_globals.hpp c1_g ...
- Python3 标准库
Python3标准库 更详尽:http://blog.csdn.net/jurbo/article/details/52334345 文本 string:通用字符串操作 re:正则表达式操作 diff ...
- 一次rna-seq的过程-知乎live转
数据分析流程 来自知乎孟浩巍的“快速入门生物信息学的”Live,超棒的~ 1.数据质控 首先是质控部分,使用fastqc进行对结果分析. 对于Illumia二代测序的结果质控包括两个方面,去掉测序质量 ...
- python16_day11【MQ、Redis、Memcache】
一.RabbitMQ 是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列(MQ)是一种应 ...