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 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...
随机推荐
- 前端学习 -- Html&Css -- 表格
表格在日常生活中使用的非常的多,比如excel就是专门用来创建表格的工具,表格就是用来表示一些格式化的数据的,比如:课程表.银行对账单.在网页中也可以来创建出不同的表格. 在HTML中,使用table ...
- 支持ajax跨域调用的WCF搭建示例
支持ajax 跨域调用的WCF搭建 1.新建一个"ASP.NET空Web应用程序"项目. 2.新建一个“WCF服务(支持ajax)”. 3.修改WCFAjaxService.svc ...
- 简单认识python(一)
最近本宝宝被一部小说迷的神魂颠倒的,在网络上四处找免费的小说资源,一直哭唧唧的等待着每天更新的一章.实在是太可怜了,本宝宝决定自己学python,自己抓包小说. 既然知道目的地了,那就和本宝宝一起打怪 ...
- 关于next.js中的css
css进行了全局和局部的限制 export default () => ( <div className='hello'> <p>Hello World</p> ...
- P1282 多米诺骨牌
P1282 多米诺骨牌 题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S ...
- yolov2源码分析
分析过程首先我们从yolo的训练命令开始分析(yolo的源码是用c++写的): ./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darkn ...
- javascript 模拟京东关闭广告栏
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- python 爆破
python 爆破 #!/usr/bin/python #-*- coding: GB2312 -*- #author:loversorry import urllib2 import urllib ...
- 996ICU与程序猿的个人成长
目录 规划 学习 专业领域知识 知识广度 第二职业 理财 借势 添砖加瓦 最近一段时间,996ICU在互联网界引发"大地震",从普通员工.行业大佬甚至官媒都进行了发声,大家对这个问 ...
- C# 生成一个带数字的饼图
using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D ...