HDU-4348 To the moon(主席树区间修改 永久化标记)

简介: HDU-4348 To the moon(主席树区间修改 永久化标记)

link

题意:

给定一个长度为1 e 5的数组,有1 e 5次操作,操作有下面四种:

Clrd: 将[ l , r ]的值都加d,时间增加1

Qlr: 询问当前时间[ l , r ]的区间和

Hlrt: 询问t时间[ l , r ]的区间和

Bt :回到t时刻,并且t时刻之后的操作都不计

思路:

由于有不同时刻的数组,即对应不同个历史版本,考虑用主席树

但是这样,主席树进行p u s h d o w n操作的时候,公用节点都被修改,还是要新建树,空间不够

在结构体里记录一下l a z表示所有子区间的懒惰标记

修改的时候只在上层区间更新l a z,不下传

查询的时候,维护一个a d d,表示自顶向下的l a z的和,每次用a d d ∗ l e n 为区间长度)就是懒惰标记要增加的和;

这是因为对于不同时间公共的节点,不能改变l a z值,还会影响到之前的状态;

这样保证每次修改只会影响到l o g n个节点

空间复杂度:点击跳转

20200401134307494.png

代码:

const int maxn=1e5+7,mod=1e9+7,inf=0x3f3f3f3f;
int n,m,root[maxn],idx;
ll a[maxn];
struct node{
  int l,r;
  ll sum,laz;
}tr[maxn*32];
void pushup(int u,int l,int r){
  tr[u].sum=tr[tr[u].l].sum+tr[tr[u].r].sum+tr[u].laz*(r-l+1);
}
void build(int &now,int l,int r){
  now=++idx;//建立新线段树
  tr[now].sum=tr[now].laz=0;
  if(l==r){
    tr[now].sum=a[l];return ;///初始化
  }
  int mid=(l+r)/2;
  build(tr[now].l,l,mid);build(tr[now].r,mid+1,r);
  pushup(now,l,r);
}
void update(int &now,int las,int l,int r,int L,int R,int val){
  now=++idx;///对于修改的节点新建立一颗树
  tr[now]=tr[las];//先复制过来
  if(L<=l&&r<=R){//当前区间完全包含待修改区间的话
    tr[now].laz+=val;//永久化标记
    tr[now].sum+=val*(r-l+1);//求和
    return ;///及时返回 已经更新完了 不需要pushup操作
  }
  int mid=(l+r)/2;
  if(L<=mid) update(tr[now].l,tr[las].l,l,mid,L,R,val);
  if(R>mid) update(tr[now].r,tr[las].r,mid+1,r,L,R,val);
  pushup(now,l,r);
}
ll query(int now,int l,int r,int L,int R,ll add){
  //add为路径上的懒惰标记
  if(L<=l&&r<=R){
    return tr[now].sum+add*(r-l+1);///完全包含的话,值等于和加上标记的内容
  }
  ll ans=0;
  int mid=(l+r)/2;
  if(L<=mid) ans+=query(tr[now].l,l,mid,L,R,add+tr[now].laz);//注意沿途加标记
  if(R>mid) ans+=query(tr[now].r,mid+1,r,L,R,add+tr[now].laz);
  return ans;
}
int main(){
  while(~scanf("%d%d",&n,&m)){
    idx=0;
    int time=0;
    rep(i,1,n) a[i]=read;
    build(root[0],1,n);
    rep(i,1,m){
      char op[2];
      cin>>op;
      if(op[0]=='C'){
        int l=read,r=read,d=read;
        ++time;
        update(root[time],root[time-1],1,n,l,r,d);
      }
      else if(op[0]=='Q'){
        int l=read,r=read;
        printf("%lld\n",query(root[time],1,n,l,r,0));
      }
      else if(op[0]=='H'){
        int l=read,r=read,t=read;
        printf("%lld\n",query(root[t],1,n,l,r,0));
      }
      else time=read;
    }
  }
  return 0;
}
目录
相关文章
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
如何准确检测AI生成内容?这三大技术是关键
如何准确检测AI生成内容?这三大技术是关键
909 116
|
12月前
|
监控 Java 应用服务中间件
微服务——SpringBoot使用归纳——为什么学习Spring Boot
本文主要探讨为什么学习Spring Boot。从Spring官方定位来看,Spring Boot旨在快速启动和运行项目,简化配置与编码。其优点包括:1) 良好的基因,继承了Spring框架的优点;2) 简化编码,通过starter依赖减少手动配置;3) 简化配置,采用Java Config方式替代繁琐的XML配置;4) 简化部署,内嵌Tomcat支持一键式启动;5) 简化监控,提供运行期性能参数获取功能。此外,从未来发展趋势看,微服务架构逐渐成为主流,而Spring Boot作为官方推荐技术,与Spring Cloud配合使用,将成为未来发展的重要方向。
458 0
微服务——SpringBoot使用归纳——为什么学习Spring Boot
|
4月前
|
人工智能 小程序 算法
婚恋交友源码系统,uniapp跨端适配,php稳定后台,小程序+h5+app
基于TP6+Uni-app开发,支持多端同步,提供完整源码及部署指南。涵盖智能匹配、AI/真人红娘服务、多元沟通方式,助力高效交友。
175 0
|
10月前
|
编解码 人工智能 人机交互
从代码到沉浸感:聊聊V游戏开发那些事儿
从代码到沉浸感:聊聊V游戏开发那些事儿
173 16
|
4月前
|
弹性计算 安全
阿里云无影云电脑官网链接整理,个人版、企业版和商业版产品入口整理
阿里云无影官网提供无影云电脑企业版、个人版、商业版入口,涵盖产品介绍、官方下载及管理登录页面。用户可通过wuying.com或阿里云官网访问,实现高效安全的云端办公。
|
4月前
|
XML Android开发 数据格式
Android Jetpack Compose 从入门到精通
Jetpack Compose 是 Google 推出的现代化 Android 声明式 UI 框架,基于 Kotlin,简化传统 XML 开发。本教程系统讲解其核心概念:可组合函数、状态管理、布局系统、Modifier 修饰符、列表滚动、主题样式、导航与动画等,助你高效构建响应式、高性能应用界面,掌握从入门到高级的最佳实践与技巧。
405 0
|
图形学
【unity小技巧】受伤屏幕闪红、死亡动画、死亡黑屏效果
【unity小技巧】受伤屏幕闪红、死亡动画、死亡黑屏效果
1077 2
|
设计模式 前端开发 Java
步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理
通过对 `DispatcherServlet`源码的深入剖析,我们了解了SpringMVC请求处理的全流程。`DispatcherServlet`作为前端控制器,负责请求的接收和分发,处理器映射和适配负责将请求分派到具体的处理器方法,视图解析器负责生成和渲染视图。理解这些核心组件及其交互原理,有助于开发者更好地使用和扩展SpringMVC框架。
480 4
|
人工智能 运维 监控
云卓越架构:企业稳定性架构体系和AI业务场景探秘
本次分享由阿里云智能集团公共云技术服务部上海零售技术服务高级经理路志华主讲,主题为“云卓越架构:企业稳定性架构体系和AI业务场景探秘”。内容涵盖四个部分:1) 稳定性架构设计,强调高可用、可扩展性、安全性和可维护性;2) 稳定性保障体系和应急体系的建立,确保快速响应和恢复;3) 重大活动时的稳定重宝策略,如大促或新业务上线;4) AI在企业中的应用场景,包括智能编码、知识库问答、创意广告生成等。通过这些内容,帮助企业在云计算环境中构建更加稳定和高效的架构,并探索AI技术带来的创新机会。
|
数据采集 数据可视化 数据管理
台州银行数据建设,打造小微金融治理新标杆
台州银行数据建设,打造小微金融治理新标杆
462 1

热门文章

最新文章