HDU4348:To the moon
浅谈主席树: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的更多相关文章
- SPOJ:To the moon
题面 vjudge Sol 主席树模板 # include <bits/stdc++.h> # define RG register # define IL inline # define ...
- Moon.Orm 5.0(MQL版)及之前版本的开源计划
开源综述:步步开源 Moon.Orm 5.0 (MQL版) 版本维护及下载 (跟踪发布) Moon.Orm 5.0系列文章 Moon.Orm 5.0性能问题,将发言权交给你! 一.5.0目前的情况,步 ...
- Moon.Orm 5.0 (MQL版)
Moon.Orm 5.0 (MQL版) 实战实例Moon.Orm 5.0 革命性的设计 打造最便捷的异步分页技术(提供下载) 摘要: 一.建一个项目(以WebForm为例)配置文件配置(注意您自己的路 ...
- JS教程:从0开始
一. JS简介 1. JavaScript概述 JavaScript 是世界上最流行的编程语言.这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记本电脑.平板电脑和智能手机等设备. ...
- 前端每日实战:36# 视频演示如何利用 CSS 动画原理,在页面上表现日蚀现象
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/OELvrK 可交互视频教程 此视频 ...
- Java牛角尖【007】:Java中的Error能不能被Catch
Java牛角尖[007]:Java中的Error能不能被Catch 网上看到很多朋友说Java中Error是无法Catch到的,而Java中定义的Error类型又很难测试到,那就估且以为确是如此吧 ...
- 前端每日实战:55# 视频演示如何用纯 CSS 创作一个太阳、地球、月亮的运转模型
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/RJjQYY 可交互视频 此视频是可 ...
- python 爬虫1
简单访问有道词典的翻译界面,将页面翻译功能简单呈现 import urllib.request import urllib.parse import json content = input(&quo ...
- Linux字符界面下用户账户的设置
在Linux系统字符界面下创建.修改以及删除用户账户主要使用useradd,usermod和userdel这3个命令. 一.创建用户账户 创建用户账户就是在系统中创建一个新账户,然后为新账户分配用户U ...
随机推荐
- Autoprefixer:一个以最好的方式处理浏览器前缀的后处理程序
Autoprefixer解析CSS文件并且添加浏览器前缀到CSS规则里,使用Can I Use的数据来决定哪些前缀是需要的. 所有你需要做的就是把它添加到你的资源构建工具(例如 Grunt)并且可以完 ...
- zookeeper启动流程简单梳理
等着測试童鞋完工,顺便里了下zookeeper的启动流程 zk3.4.6 启动脚本里面 nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_ ...
- 多通道(比方RGB三通道)卷积过程
今天一个同学问 卷积过程好像是对 一个通道的图像进行卷积, 比方10个卷积核,得到10个feature map, 那么输入图像为RGB三个通道呢,输出就为 30个feature map 吗, 答案肯定 ...
- Python 单元测试 之setUP() 和 tearDown()
setUp:表示前置条件,它在每一个用例执行之前必须会执行一次 setUp可以理解为我们需要自动化测试时,需要打开网页窗口,输入对应测试地址,这一些属于前置条件. tearDown:表示释放资源,它在 ...
- __str__ 和 __unicode__ 的区别和用法
转自:https://www.cnblogs.com/painberg/p/8514860.html 简而言之,就是__str__和__unicode__都是为了再管理站点中加载这个表时想显示什么属性 ...
- 【BZOJ2597】[Wc2007]剪刀石头布 最小费用流
[BZOJ2597][Wc2007]剪刀石头布 Description 在一些一对一游戏的比赛(如下棋.乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过A的有趣情况,不妨形象的称之 ...
- springcloud与docker微服务架构实战--笔记
看了<微服务那些事>之后,Spring boot和Spring Cloud的关系理清楚了,Spring cloud各个模块的作用也了解了. 但是,Spring cloud 与Docker的 ...
- 实现RTSP网站微信直播方案EasyNVR(linux版)部署问题之:ERR_CONTENT_LENGTH_MISMATCH
发现问题: 想要优化一下EasyNVR相关功能,内部测试软件,于是在linux系统中部署了一台EasyNVR.当部署好,运行起来发现问题: EasyNVR的配置页面数据出不来. 分析问题: 基于是we ...
- 九度OJ 1178:复数集合 (插入排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8393 解决:1551 题目描述: 一个复数(x+iy)集合,两种操作作用在该集合上: 1.Pop 表示读出集合中复数模值最大的那个复数,如 ...
- 远程服务器上的weblogic项目管理(五) PermGen内存溢出问题
weblogic偶尔会出现PermGen异常,内存溢出的问题,这个时候需要修改weblogic安装目录下的domain/common/bin/commEnv.cmd. 打开后在其中找到: set ME ...