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 ...
随机推荐
- jquery插件获取事件类型
//需要在使用函数时传入event关键字 $('[name=lprice]').change(function(event){ $('[name=lprice]').validate({ event: ...
- jquery瀑布流布局插件,兼容ie6不支持下拉加载,用于制作分类卡
调用方法 $('需要布局的块').sault() 如果要在图片加载后调用需要使用$(window).load(function(fx){});函数,即等待图片加载完成再调用 3个参数 1.left:左 ...
- 说说我的web前端之路,分享些前端的好书(转)
WEB前端研发工程师,在国内算是一个朝阳职业,这个领域没有学校的正规教育,大多数人都是靠自己自学成才.本文主要介绍自己从事web开发以来(从大二至今)看过的书籍和自己的成长过程,目的是给想了解Java ...
- 【Java】 Spring依赖注入小试牛刀:编写第一个Spring ApplicationContext Demo
0 Spring的依赖注入大致是这样工作的: 将对象如何构造(ID是什么?是什么类型?给属性设置什么值?给构造函数传入什么值?)写入外部XML文件里.在调用者需要调用某个类时,不自行构造该类的对象, ...
- webpack 样式分离之The root route must render a single element
公司项目使用的是webpack1,使用extract-text-webpack-plugin 插件无法将css分离出来,检查原因,发现有如下代码 <Route path="/home& ...
- javaScript 深层复制
在工作中遇到了深浅复制的问题,所以详细总结一下: 深复制和浅复制只针对像 Object, Array 这样的复杂对象的.简单来说,浅复制只复制一层对象的属性,而深复制则递归复制了所有层级. var o ...
- eclipse集成tomcat改动字符集參数
问题: 在eclipse 4.4(Luna)中集成tomcat时,直接改动原tomcat文件夹中的配置文件,不起作用. 有时.我们会修改字符集參数为utf-8,以解决中文乱码问题,修改之后依旧乱码-- ...
- 计算机网络 --万维网www
万维网是一个分布式的超媒体系统,客户程序向服务器程序发出请求,服务器程序向客户程序送回客户所需要的万维网文档.万维网必须解决的几个问题:1.怎样标志分布在整个因特网上的万维网文档?答:万维网使用统一的 ...
- 九度OJ 1009:二叉搜索树 (二叉树)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6321 解决:2767 题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需 ...
- java array
1 array变量 Type[] array_virable_name; 2 array对象 2.1 new Type[] array_virable_name = new Type[NUM]; 2. ...