浅谈主席树:https://www.cnblogs.com/AKMer/p/9956734.html

浅谈标记永久化:https://www.cnblogs.com/AKMer/p/10137227.html

题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4348

相比一般的主席树,这个要多支持一个操作,那就是区间修改。我们不能把区间里的每一条链都建出来,因为那样时间空间都不允许,所以我们可以依靠标记永久化来实现。每次询问的时候,把一路上的标记全部累加起来,再计算对当前区间答案的影响就好了。

时间复杂度:\(O((n+m)logn)\)

空间复杂度:\(O((n+m)logn)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll; const int maxn=1e5+5; char s[10];
int n,m,tim;
int a[maxn],rt[maxn]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} struct tree_node {
ll sum;
int ls,rs,tag;
}; struct Chairman_tree {
int tot;
tree_node tree[maxn*30]; void updata(int p) {
tree[p].sum=tree[tree[p].ls].sum+tree[tree[p].rs].sum;
} void build(int &now,int l,int r) {
now=++tot;tree[now].tag=0;
if(l==r) {
tree[now].sum=a[l];
tree[now].ls=tree[now].rs=0;
return;
}
int mid=(l+r)>>1;
build(tree[now].ls,l,mid);
build(tree[now].rs,mid+1,r);
updata(now);
} void change(int lst,int &now,int l,int r,int L,int R,int v) {
now=++tot;tree[now]=tree[lst];
tree[now].sum+=1ll*(min(r,R)-max(l,L)+1)*v;//记得要一路修改下去
//如果调用updata函数用儿子节点更新自己的值,可能会用没被标记影响的上一个版本的主席树的儿子来更新自己
if(L<=l&&r<=R) {
tree[now].tag+=v;
return;
}
int mid=(l+r)>>1;
if(L<=mid)change(tree[lst].ls,tree[now].ls,l,mid,L,R,v);
if(R>mid)change(tree[lst].rs,tree[now].rs,mid+1,r,L,R,v);
} ll query(int now,int l,int r,int L,int R,int res) {
if(L<=l&&r<=R)return tree[now].sum+1ll*(r-l+1)*res;
int mid=(l+r)>>1;ll val=0;
if(L<=mid)val+=query(tree[now].ls,l,mid,L,R,res+tree[now].tag);
if(R>mid)val+=query(tree[now].rs,mid+1,r,L,R,res+tree[now].tag);
return val;
}
}T; int main() {
while(~scanf("%d%d",&n,&m)) {
tim=T.tot=0;
for(int i=1;i<=n;i++)
a[i]=read();
T.build(rt[0],1,n);
for(int i=1;i<=m;i++) {
scanf("%s",s+1);
if(s[1]=='C') {
tim++;int l=read(),r=read(),d=read();
T.change(rt[tim-1],rt[tim],1,n,l,r,d);
}
else if(s[1]=='Q') {
int l=read(),r=read();
ll ans=T.query(rt[tim],1,n,l,r,0);
printf("%lld\n",ans);
}
else if(s[1]=='H') {
int l=read(),r=read(),t=read();
ll ans=T.query(rt[t],1,n,l,r,0);
printf("%lld\n",ans);
}
else if(s[1]=='B') {
int t=read();
tim=t;T.tot=rt[tim+1];
}
}
}
return 0;
}

HDU4348:To the moon的更多相关文章

  1. SPOJ:To the moon

    题面 vjudge Sol 主席树模板 # include <bits/stdc++.h> # define RG register # define IL inline # define ...

  2. Moon.Orm 5.0(MQL版)及之前版本的开源计划

    开源综述:步步开源 Moon.Orm 5.0 (MQL版) 版本维护及下载 (跟踪发布) Moon.Orm 5.0系列文章 Moon.Orm 5.0性能问题,将发言权交给你! 一.5.0目前的情况,步 ...

  3. Moon.Orm 5.0 (MQL版)

    Moon.Orm 5.0 (MQL版) 实战实例Moon.Orm 5.0 革命性的设计 打造最便捷的异步分页技术(提供下载) 摘要: 一.建一个项目(以WebForm为例)配置文件配置(注意您自己的路 ...

  4. JS教程:从0开始

    一. JS简介 1. JavaScript概述 JavaScript 是世界上最流行的编程语言.这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记本电脑.平板电脑和智能手机等设备. ...

  5. 前端每日实战:36# 视频演示如何利用 CSS 动画原理,在页面上表现日蚀现象

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/OELvrK 可交互视频教程 此视频 ...

  6. Java牛角尖【007】:Java中的Error能不能被Catch

      Java牛角尖[007]:Java中的Error能不能被Catch 网上看到很多朋友说Java中Error是无法Catch到的,而Java中定义的Error类型又很难测试到,那就估且以为确是如此吧 ...

  7. 前端每日实战:55# 视频演示如何用纯 CSS 创作一个太阳、地球、月亮的运转模型

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/RJjQYY 可交互视频 此视频是可 ...

  8. python 爬虫1

    简单访问有道词典的翻译界面,将页面翻译功能简单呈现 import urllib.request import urllib.parse import json content = input(&quo ...

  9. Linux字符界面下用户账户的设置

    在Linux系统字符界面下创建.修改以及删除用户账户主要使用useradd,usermod和userdel这3个命令. 一.创建用户账户 创建用户账户就是在系统中创建一个新账户,然后为新账户分配用户U ...

随机推荐

  1. Autoprefixer:一个以最好的方式处理浏览器前缀的后处理程序

    Autoprefixer解析CSS文件并且添加浏览器前缀到CSS规则里,使用Can I Use的数据来决定哪些前缀是需要的. 所有你需要做的就是把它添加到你的资源构建工具(例如 Grunt)并且可以完 ...

  2. zookeeper启动流程简单梳理

    等着測试童鞋完工,顺便里了下zookeeper的启动流程 zk3.4.6 启动脚本里面 nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_ ...

  3. 多通道(比方RGB三通道)卷积过程

    今天一个同学问 卷积过程好像是对 一个通道的图像进行卷积, 比方10个卷积核,得到10个feature map, 那么输入图像为RGB三个通道呢,输出就为 30个feature map 吗, 答案肯定 ...

  4. Python 单元测试 之setUP() 和 tearDown()

    setUp:表示前置条件,它在每一个用例执行之前必须会执行一次 setUp可以理解为我们需要自动化测试时,需要打开网页窗口,输入对应测试地址,这一些属于前置条件. tearDown:表示释放资源,它在 ...

  5. __str__ 和 __unicode__ 的区别和用法

    转自:https://www.cnblogs.com/painberg/p/8514860.html 简而言之,就是__str__和__unicode__都是为了再管理站点中加载这个表时想显示什么属性 ...

  6. 【BZOJ2597】[Wc2007]剪刀石头布 最小费用流

    [BZOJ2597][Wc2007]剪刀石头布 Description 在一些一对一游戏的比赛(如下棋.乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过A的有趣情况,不妨形象的称之 ...

  7. springcloud与docker微服务架构实战--笔记

    看了<微服务那些事>之后,Spring boot和Spring Cloud的关系理清楚了,Spring cloud各个模块的作用也了解了. 但是,Spring cloud 与Docker的 ...

  8. 实现RTSP网站微信直播方案EasyNVR(linux版)部署问题之:ERR_CONTENT_LENGTH_MISMATCH

    发现问题: 想要优化一下EasyNVR相关功能,内部测试软件,于是在linux系统中部署了一台EasyNVR.当部署好,运行起来发现问题: EasyNVR的配置页面数据出不来. 分析问题: 基于是we ...

  9. 九度OJ 1178:复数集合 (插入排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8393 解决:1551 题目描述: 一个复数(x+iy)集合,两种操作作用在该集合上: 1.Pop 表示读出集合中复数模值最大的那个复数,如 ...

  10. 远程服务器上的weblogic项目管理(五) PermGen内存溢出问题

    weblogic偶尔会出现PermGen异常,内存溢出的问题,这个时候需要修改weblogic安装目录下的domain/common/bin/commEnv.cmd. 打开后在其中找到: set ME ...