hdu 4348 To the moon (主席树区间更新)
题意:
一个长度为n的数组,4种操作 :
(1)C l r d:区间[l,r]中的数都加1,同时当前的时间戳加1 。
(2)Q l r:查询当前时间戳区间[l,r]中所有数的和 。
(3)H l r t:查询时间戳t区间[l,r]的和 。
(4)B t:将当前时间戳置为t 。
所有操作均合法 。
题解
原来……主席树真的能做可持久化的啊……花了一个下午才搞明白……(虽然是看题解的)
先考虑一下,如果直接每一次修改的话,一共要修改$r-l+1$次,空间复杂度绝对爆炸
然后考虑一下线段树的打懒标记,可不可以套到主席树上来?
我们发现可以这么做,于是每一次修改区间时,如果区间相等,直接打上标记,等到查询的时候,再把标记给加上去
ps:更改时间的时候可以直接把$cnt$改成$rt[t+1]-1$,这样的话可以回收空间
//minamoto
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=,M=N*;
int n,m,cnt,rt[N];
int L[M],R[M];ll sum[M],add[M];
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline ll read(){
#define num ch-'0'
char ch;bool flag=;ll res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
void build(int &now,int l,int r){
add[now=++cnt]=;
if(l==r) return (void)(sum[now]=read());
int mid=(l+r)>>;
build(L[now],l,mid);
build(R[now],mid+,r);
sum[now]=sum[L[now]]+sum[R[now]];
}
void update(int last,int &now,int l,int r,int ql,int qr,int x){
now=++cnt;
L[now]=L[last],R[now]=R[last],add[now]=add[last],sum[now]=sum[last];
sum[now]+=1ll*x*(qr-ql+);
if(ql==l&&qr==r) return (void)(add[now]+=x);
int mid=(l+r)>>;
if(qr<=mid) update(L[last],L[now],l,mid,ql,qr,x);
else if(ql>mid) update(R[last],R[now],mid+,r,ql,qr,x);
else return (void)(update(L[last],L[now],l,mid,ql,mid,x),update(R[last],R[now],mid+,r,mid+,qr,x));
}
ll query(int now,int l,int r,int ql,int qr){
if(l==ql&&r==qr) return sum[now];
int mid=(l+r)>>;
ll res=1ll*add[now]*(qr-ql+);
if(qr<=mid) res+=query(L[now],l,mid,ql,qr);
else if(ql>mid) res+=query(R[now],mid+,r,ql,qr);
else res+=query(L[now],l,mid,ql,mid)+query(R[now],mid+,r,mid+,qr);
return res;
}
int main(){
//freopen("testdata.in","r",stdin);
n=read(),m=read();
cnt=-;
build(rt[],,n);
int now=;
while(m--){
char ch;int l,r,x;
while(!isupper(ch=getc()));
switch(ch){
case 'C':{
l=read(),r=read(),x=read();
++now;
update(rt[now-],rt[now],,n,l,r,x);
break;
}
case 'Q':{
l=read(),r=read();
printf("%lld\n",query(rt[now],,n,l,r));
break;
}
case 'H':{
l=read(),r=read(),x=read();
printf("%lld\n",query(rt[x],,n,l,r));
break;
}
case 'B':{
now=read();
cnt=rt[now+]-;
break;
}
}
}
return ;
}
hdu 4348 To the moon (主席树区间更新)的更多相关文章
- hdu 4348 To the moon 主席树区间更新
To the moon Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Prob ...
- HDU 4348 To the moon 主席树 在线更新
http://acm.hdu.edu.cn/showproblem.php?pid=4348 以前做的主席树没有做过在线修改的题做一下(主席树这种东西正经用法难道不是在线修改吗),标记永久化比较方便. ...
- hdu 4348 To the moon (主席树)
版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4348 题意: 一个长度为n的数组,4种操作 : (1)C l r d:区间[l,r]中的数都加1,同时当前的时间戳加1 . (2)Q ...
- HDU 4348 To the moon 主席树
题意: 给出一个长度为\(n(n \leq 10^5)\)的序列,最开始时间\(t=0\),支持下面几个操作: \(C \, l \, r \, d\):将区间\([l,r]\)每个数都加上\(d\) ...
- HDU 4348 主席树区间更新
To the moon Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- HDU.1556 Color the ball (线段树 区间更新 单点查询)
HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...
- HDU 4348 To the moon(主席树 区间更新)题解
题意: 给一个数组A[1] ~ A[n],有4种操作: Q l r询问l r区间和 C l r v给l r区间每个数加v H l r t询问第t步操作的时候l r区间和 B t返回到第t步操作 思路: ...
- HDU 4348 To the moon (主席树区间更新)
题意:首先给你n个数,开始时间为0,最后按照操作输出 给你四种操作: 1. C l r d : 在(l,r)区间都加上d,时间加一2. Q l r : 询问现在(l,r)的区间和3. H l r ...
- HDU 1556 Color the ball(线段树区间更新)
Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...
随机推荐
- suoi08 一收一行破 (tarjanLca+树状数组)
用一个差分树状数组维护一下每个深度的和,然后每次拿着路径端点和lca加一加减一减就行了 #include<bits/stdc++.h> #define pa pair<int,int ...
- Redis我想入门——启动
nosql数据库出现到现在很多年了.笔者一直从事C/S模式的上开发.所以相对而言笔者只是听过却从来不知道他是什么东西.时代在变化,当年所有业务都放在一个War包的时代已经不在了.微服务已经成为了世界主 ...
- (转)Redis的那些最常见面试问题
背景:最近在准备面试相关的题目,发现redis基本一片空白,有必要好好总结下. 转自:https://www.cnblogs.com/Survivalist/p/8119891.html 1.什么是r ...
- typescript类(学习笔记非干货)
我们声明一个 Greeter类.这个类有3个成员:一个叫做greeting的属性,一个构造函数和一个greet方法. We declare a Greeter class. This class ha ...
- linux command ------ find
find | grep luoluo 将当前目录及子目录的文件名中含有luoluo的文件过滤出来 | 是管道,把find查找的内容传递给下个命令(grep) find后面不加其他内容(比如路径)表示打 ...
- 2018acm-icpc西安邀请赛后记
第一次参加icpc的邀请赛,有一点小激动,深知大一弱队实力弱,赛前给队友的目标就是拿块铜,不打铁. 热身赛因为没有用过pc^2,codeblocks又用不习惯的原因,开始调工程调了很久,差一点拿到A题 ...
- Xenserver 如何设置VM boot options
#1. SSH到xen物理机 #2. 查看VM的 uuid xe vm-list #3. 设置VM的BIOS xe vm-param-set uuid={vm uuid} HVM-boot-polic ...
- maven的pom.xml文件标签含义
pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现.主要描述了项目:包括配置文件:开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以 ...
- php循环删除文件夹和目录
一定要注意文件夹中的两个目录----> .(当前目录) ..(上级目录) 需要对这两个目录进行过滤, 否则在删除或者遍历是会一直,对于..甚至会向你指定的文件夹的上级目录循环操作,删除重要 ...
- WebLogic Server添加删除补丁操作【转】【补】
WebLogic Server添加删除补丁操作 0 查看当前weblogic版本 [weblogic@localhost bin]$ cd /data/bea/weblogic11/wlserver_ ...