主席树 hdu 4348
题意:有一个由n个数组成的序列,有4中操作:
1.C l r d [l,r]这段区间都加上d
2.Q l r 询问[l,r]这段区间的和
3.H l r t 询问之前t时间[l,r]的区间和
4.B t 回到t时间,且下一秒的时间从t开始
按时间建立主席树,主席树上的每一棵线段树维护[1,n]这段序列的信息,这里成段更新的时候要注意,以往写线段树的时候,都是把lazy标记向下传,但是写主席树的时候每一次下传,那么新的节点数就会非常多,会爆内存,所以我们不把lazy操作下传,只是在询问的时候,最后累加的答案加上每一个父亲节点上的lazy值。
#include<cstdio>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=1e5+;
ll a[maxn];
int root[maxn];
struct node
{
int ln,rn;
ll lazy,sum;
}tree[maxn*]; int cnt;
void build(int &x,int l,int r)
{
++cnt;x=cnt;
tree[x].lazy=;
if(l==r){
tree[x].sum=a[l];
return;
}
int mid=l+r>>;
build(tree[x].ln,l,mid);
build(tree[x].rn,mid+,r);
tree[x].sum=tree[tree[x].ln].sum+tree[tree[x].rn].sum;
}
void update(int &x,int y,int L,int R,int l,int r,int val)
{
tree[++cnt]=tree[y];
x=cnt;
if(L==l&&R==r){
tree[cnt].lazy+=val;
tree[cnt].sum+=(R-L+)*val;
return;
}
tree[x].sum+=(R-L+)*val;
int mid=l+r>>;
if(R<=mid) update(tree[x].ln,tree[y].ln,L,R,l,mid,val);
else if(L>mid) update(tree[x].rn,tree[y].rn,L,R,mid+,r,val);
else{
update(tree[x].ln,tree[y].ln,L,mid,l,mid,val);
update(tree[x].rn,tree[y].rn,mid+,R,mid+,r,val);
}
}
ll query(int root,int L,int R,int l,int r)
{
ll ans=;
if(l==L&&r==R) return tree[root].sum;
ans+=(ll)tree[root].lazy*(ll)(R-L+);
int mid=l+r>>;
if(R<=mid) ans+=query(tree[root].ln,L,R,l,mid);
else if(L>mid) ans+=query(tree[root].rn,L,R,mid+,r);
else{
ans+=query(tree[root].ln,L,mid,l,mid);
ans+=query(tree[root].rn,mid+,R,mid+,r);
}
return ans;
}
void init()
{
cnt=;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
init();
for(int i=;i<=n;i++) scanf("%lld",&a[i]);
int now=;
build(root[],,n);
char t1[];int t2,t3,t4;
while(m--){
scanf("%s",t1);
if(t1[]=='Q'){
//当前时间线;
scanf("%d%d",&t2,&t3);
ll ans=query(root[now],t2,t3,,n);
printf("%lld\n",ans);
}
else if(t1[]=='C'){
now++;
scanf("%d%d%d",&t2,&t3,&t4);
update(root[now],root[now-],t2,t3,,n,t4);
}
else if(t1[]=='H'){
//某个时间线;
scanf("%d%d%d",&t2,&t3,&t4);
ll ans=query(root[t4],t2,t3,,n);
printf("%lld\n",ans);
}
else{
//返回某个时间线;
scanf("%d",&t2);
now=t2;
}
}
}
return ;
}
主席树 hdu 4348的更多相关文章
- 主席树 hdu 4417
求一个区间内小于等于limit的数: 主席树模板题. 求出每一个节点的sum: #include<cstdio> #include<algorithm> #include< ...
- dfs序 线段树 dfs序列 主席树
并查集 #include<stdio.h> ]; void sset(int x) { ;i<=x;i++) stt[i]=i; } int ffind(int x) { if(x= ...
- hdu 4348 To the moon (主席树 区间更新)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4348 题意: 4种操作: C l r c 区间[l,r]加c,时间+1 Q l r 询问当前时 ...
- 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 主席树 在线更新
http://acm.hdu.edu.cn/showproblem.php?pid=4348 以前做的主席树没有做过在线修改的题做一下(主席树这种东西正经用法难道不是在线修改吗),标记永久化比较方便. ...
- To the moon HDU - 4348 (主席树,区间修改)
Background To The Moon is a independent game released in November 2011, it is a role-playing adventu ...
- 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的数组,4种操作 : (1)C l r d:区间[l,r]中的数都加1,同时当前的时间戳加1 . (2)Q l r:查询当前时间戳区间[l,r]中所有数的和 . (3)H ...
- HDU 4348 To the moon(主席树区间修改)
题意 给你一个区间,支持如下操作: 在一段区间内加上一个值,并生成一个历史版本 查询某个版本下一段区间内的和 回到一个历史版本上并舍弃之后的版本 做法 这就是主席树区间修改裸题啦QwQ 上一篇博客我讲 ...
随机推荐
- 51Nod 1091 线段的重叠 (贪心)
X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 20]和[12 25]的重叠部分为[12 20]. 给出N条线段的起点和终点,从中选出2条线段,这两条线段的重叠部分是最长 ...
- [CF1304F] Animal Observation - dp,单调队列
设 \(f[i][j]\) 为第 \(i\) 天在第 \(j\) 个位置放置的最大值,设 \(s[i][j]\) 是第 \(i\) 行的前缀和,则 \[ \begin{align} f[i][j] & ...
- android 根据坐标返回触摸到的View
//根据坐标返回触摸到的Viewprivate View getTouchTarget(View rootView, int x, int y) { View targetView = null; / ...
- C++-POJ1995-Raising Modulo Numbers[快速幂]
#include <cstdio> typedef long long ll; int quick_pow(ll a,ll b,ll mod){ ll ans=; ))ans=(ans*a ...
- 【填坑】python3 manage.py migrate:?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
问题: WARNINGS:?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default' H ...
- Linux system basic 2 + add kernel for Jupyter
Linux install LibreOffice: install LibreOffice: install command: sudo apt install ./XXX.deb PS: don' ...
- C++-怎样写程序(面向对象)
使用编程语言写好程序是有技巧的. 主要编程技术: 1. 编程风格 2. 算法 3. 数据结构 4. 设计模式 5. 开发方法 编程风格指的是编程的细节,比如变量名的选择方法.函数的写法等. 算法是解决 ...
- 快速搭建SSM框架环境开发项目【配置】
maven在线仓库https://mvnrepository.com/ maven构建项目 pom.xml <project xmlns="http://maven.apache.or ...
- eclipse查看jar包源代码乱码问题解决
文章来源 今天在eclipse中查看java的jar包中的源代码时,显示的全部是乱码.起初只设置了content types还不行,还是乱码.不过问题最后解决了,配置步骤如下: 首先要知道你需要配置的 ...
- .Net中C# DateTime类的ToString()方法的使用
Console.WriteLine("ToShortDateString:" + DateTime.Now.ToShortDateString()); Console.WriteL ...