http://acm.hdu.edu.cn/showproblem.php?pid=4348

以前做的主席树没有做过在线修改的题做一下(主席树这种东西正经用法难道不是在线修改吗),标记永久化比较方便。

前面眼瞎爆了一次空间改过来之后交第二次奇迹一样a了,好久没有1A过了(泪)。

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define LL long long
const int maxn=;
int n,m;
char s[]={};
int t[maxn]={},shu[maxn]={},lc[maxn*]={},rc[maxn*]={};
LL sum[maxn*]={},ad[maxn*]={},cnt=;
int tot=;
void build(int &x,int l,int r){
x=++tot;
//cout<<l<<r<<endl;
if(l==r){scanf("%lld",&sum[x]); return;}
int mid=(l+r)/;
build(lc[x],l,mid);
build(rc[x],mid+,r);
sum[x]=sum[lc[x]]+sum[rc[x]];
}
void updata(int x,int l,int r){
sum[x]=sum[lc[x]]+sum[rc[x]]+ad[x]*(LL)(r-l+);
}
void getadd(int &x,int y,int l,int r,int zl,int zr,LL z){
x=++tot;sum[x]=sum[y];ad[x]=ad[y];lc[x]=lc[y];rc[x]=rc[y];
if(zl<=l&&r<=zr){sum[x]=sum[y]+z*(LL)(r-l+);ad[x]+=z; return;}
int mid=(l+r)/;
if(zl<=mid)getadd(lc[x],lc[y],l,mid,zl,zr,z);
if(mid<zr)getadd(rc[x],rc[y],mid+,r,zl,zr,z);
updata(x,l,r);
}
LL gethis(int x,int l,int r,int zl,int zr,LL zhi){
if(zl<=l&&r<=zr){return sum[x]+zhi*(LL)(r-l+);}
int mid=(l+r)/;LL ans=;
if(zl<=mid)ans+=gethis(lc[x],l,mid,zl,zr,zhi+ad[x]);
if(mid<zr)ans+=gethis(rc[x],mid+,r,zl,zr,zhi+ad[x]);
return ans;
}
int main(){
int fla=;
while(~scanf("%d%d",&n,&m)){
if(fla)printf("\n");++fla;
tot=;cnt=;
build(t[],,n);shu[]=tot;
int x,y,z;
for(int i=;i<=m;i++){
scanf("%s",s);
if(s[]=='C'){
scanf("%d%d%d",&x,&y,&z);
cnt++;t[cnt]=t[cnt-];
getadd(t[cnt],t[cnt],,n,x,y,z);
shu[cnt]=tot;
}
else if(s[]=='Q'){
scanf("%d%d",&x,&y);
printf("%lld\n",gethis(t[cnt],,n,x,y,));
}
else if(s[]=='H'){
scanf("%d%d%d",&x,&y,&z);
printf("%lld\n",gethis(t[z],,n,x,y,));
}
else{
scanf("%d",&x);
cnt=x;tot=shu[x];
}
}
}
return ;
}

HDU 4348 To the moon 主席树 在线更新的更多相关文章

  1. hdu 4348 To the moon (主席树)

    版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4348 题意: 一个长度为n的数组,4种操作 : (1)C l r d:区间[l,r]中的数都加1,同时当前的时间戳加1 . (2)Q ...

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

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

  3. HDU 4348 To the moon 主席树

    题意: 给出一个长度为\(n(n \leq 10^5)\)的序列,最开始时间\(t=0\),支持下面几个操作: \(C \, l \, r \, d\):将区间\([l,r]\)每个数都加上\(d\) ...

  4. hdu 4348 To the moon 主席树区间更新

    To the moon Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Prob ...

  5. 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    询问当前时 ...

  6. 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步操作 思路: ...

  7. HDU 4348 To the moon(主席树区间修改)

    题意 给你一个区间,支持如下操作: 在一段区间内加上一个值,并生成一个历史版本 查询某个版本下一段区间内的和 回到一个历史版本上并舍弃之后的版本 做法 这就是主席树区间修改裸题啦QwQ 上一篇博客我讲 ...

  8. 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 ...

  9. HDU 4348.To the moon SPOJ - TTM To the moon -可持久化线段树(带修改在线区间更新(增减)、区间求和、查询历史版本、回退到历史版本、延时标记不下放(空间优化))

    To the moon Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

随机推荐

  1. vue组件间通信

    组件间通信(父子,兄弟) 相关链接\组件通信http://www.cnblogs.com/xulei1992/p/6121974.html 学习链接Vue.js--60分钟快速入门http://www ...

  2. PCI学习之总线原理01

    -----------以下资料由网络资料整理而成-------- PCI即Peripheral Component Interconnect,中文的意思是“外围器件互联”. PCI总线支持32位和64 ...

  3. Linux 查看内存插槽数、最大容量的方法

    查看内存插槽数: dmidecode|grep -P -A5 "Memory\s+Device"|grep Size|grep -v Range 查看最大容量: dmidecode ...

  4. 在jsp页面中设置了远程验证,在初始化时必须预先调用一次。

    参考链接:http://code.taobao.org/p/sztaotao/diff/5/trunk/code/src/main/webapp/webpage/modules/sys/roleFor ...

  5. python3实现socket通信

    目的:实现两台机器之间的通信.也就是说一个作为服务端(时刻监听接收数据),另一个作为客户端(发送数据). Python实现的过程个人理解: 1.服务端开始监听. 2.客户端发起连接请求. 3.服务端收 ...

  6. 【前端开发】限制input输入保留两位小数

    <input type="text" name='amount' id="cash_num" placeholder="请输入金额" ...

  7. C#实现控制Windows系统关机、重启和注销的方法

    shutdown命令的参数: shutdown.exe -s:关机shutdown.exe -r:关机并重启shutdown.exe -l:注销当前用户 shutdown.exe -s -t 时间:设 ...

  8. Java线程:新特征-有返回值的线程《转》

      原始文章   在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了.   现在Java终于有可返回值的任务(也可以叫做线程)了. ...

  9. 洛谷P3396哈希冲突

    传送门啦 非常神奇的分块大法. 这个题一看数据范围,觉得不小,但是如果我们以 $ \sqrt(x) $ 为界限,数据范围就降到了 $ x < 400 $ 我们设数组 $ f[i][j] $ 表示 ...

  10. 怎么区分MSSQL中nvarchar和varchar的区别?

    怎么区分MSSQL中nvarchar和varchar的区别呢?下面两段代码可以帮你看到他们的区别. declare @s Nvarchar(10) set @s='那么相当于abcd可以存储多少个汉字 ...