树状数组相关

前置细节 

  • lowbit(x)=x\&(-x),得到x转二进制后,从右往左数第一个1与之前所有的0构成数
  • 树状数组最终形成如上图结构
  • t[i]维护的是[i-lowbit(i)+1,i]的信息
  • i+lowbit(x),如4\rightarrow 8=100+100,6\rightarrow 8=110+10,7\rightarrow 8=111+1
  • 即到上层,包含当前区间的大区间
  • i-lowbit(i),如6\rightarrow 4=110-10,5\rightarrow 2=101-1
  • 即到同一层的前一个,与当前区间无关的另一同等大小的区间
  • t[i]的信息是由a[i],t[i-1],t[i-(10) ],\cdots ,t[i-j](j<lowbit(i))整合的
  • 如维护区间最大值,t[8]= max\ a[8],t[7],t[6],t[4]
  • 用于解决将值变小且该值为区间最大值,或将值变大且该值为区间最小值
  • 区间和不受影响原因求区间和不用管区间中某一点具体是多少

维护区间和

单点修改

void update(int x,int k) {for(int i=x;i<=size;i=lowbit(i)) {tr[i]+=k;}}

区间修改

  • 此时树状数组中维护的是差分数组 
  • add(l,r,k)\Rightarrow update(l,k),update(r,-k)

单点查询 

  • 若维护的不是差分数组,直接输出t[x]
  • 若维护的是差分数组,则ans=a[x]+query(x)a[x]为初值 
    int query(int x){int res=0;for(int i=x;i>=0;i-=lowbit(i)){res+=t[i];}return res;
    }

区间查询 

  • 若维护的不是差分数组 query(x)等于前缀和,Sum(l,r)=query(r)-query(l-1)
  • 若维护的是差分数组,则Sum(l,r)=\sum_{i=l}^{r}a[x]+query(x)

维护极值

以最大值为例 

单点修改 

void update(int x,int k) {tr[x]=k;for(int i=x;i<=size;i+=lowbit(i)) {//往上层接着更新int lw=lowbit(i);for(int j=1;j<lw;j<<=1) {tr[i]=Math.max(tr[i], tr[i-j]);//tr[8]=max tr[7],tr[6],tr[4],a[8]//7=8-1.6=8-(10),4=8-(100)}}}

区间查询 

int query(int l,int r) {//tr[i]=max [i-lowbit(i)+1,i]//if l<=i-lowbit(i)+1 直接用tr[i]//否则,只能用a[i],剩下递归l,i-1if(l>r)return 0;else if(l==r)return a[l];else if(l<=r-lowbit(r)+1)//包含[l,r]=[r-lowbit(r)+1,r]=tr[r]return Math.max(query(l, r-lowbit(r)),tr[r]);else return Math.max(query(l, r-1), a[r]);}

例:Atcoder Beginner Contest 339 E

题目大意
  • 给定一个长度为n的序列a,1\leq a_i\leq 5*1e5
  • 找到a的最长子序列,使得子序列中相邻两值的绝对差不超过D
解题思路
  • 定义f[i]表示以i点为起点的最长子序列长度
  • n-1号开始处理到0号,f[i]=(Max_{j=i+1}^{n-1} f[j])+1\&\&Math.abs(a[i]-a[j])<=D
  • 直接暴力O(n^2)过不去
  • 考虑用树状数组维护区间最值
  • 0\rightarrow 5*1e5看作数组空间,查询区间即为[max (a[i]-D,0),min(a[i]+D,5*1e5)]
  • f[i]定义为以值i为起点的最长子序列长度
  • 每处理完一个f[i],则添入树状数组中,保证处理当前第k个点,只有k+1\rightarrow n-1的结果在数组里
import java.io.*;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.BitSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;
import java.util.Vector;public class Main{static int[] a;static int[] f;//对应长度staticclass BIT{int size;int[] tr;public BIT(int n) {size=n;tr=new int[n+1];}int lowbit(int x) {return x&(-x);}void update(int x,int k) {//可能将当前区间最大值对应的点的值改小tr[x]=f[x]=k;for(int i=x;i<=size;i+=lowbit(i)) {int lw=lowbit(i);for(int j=1;j<lw;j<<=1) {tr[i]=Math.max(tr[i], tr[i-j]);//tr[8]=max tr[7],tr[6],tr[4],a[8]//7=8-1.6=8-(10),4=8-(100)}}}int query(int l,int r) {//tr[i]=max [i-lowbit(i)+1,i]//if l<=i-lowbit(i)+1 直接用tr[i]//否则,只能用a[i],剩下递归l,r-1if(l>r)return 0;else if(l==r)return f[l];else if(l<=r-lowbit(r)+1)return Math.max(query(l, r-lowbit(r)),tr[r]);else return Math.max(query(l, r-1), f[r]);}}public static void main(String[] args) throws IOException{AReader input=new AReader();PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));int n=input.nextInt();int D=input.nextInt();a=new int[n+1];for(int i=0;i<n;++i) {a[i]=input.nextInt();}BIT T=new BIT(500010);f=new int[500010];f[a[n-1]]=1;T.update(a[n-1], 1);for(int i=n-2;i>=0;--i) {int l=a[i]-D<0?0:a[i]-D;int r=a[i]+D>500000?500000:a[i]+D;int t=T.query(l, r)+1;f[a[i]]=t;T.update(a[i], t);}int mx=T.query(0, 500001);out.print(mx);out.flush();out.close();}staticclass AReader{BufferedReader bf;StringTokenizer st;BufferedWriter bw;public AReader(){bf=new BufferedReader(new InputStreamReader(System.in));st=new StringTokenizer("");bw=new BufferedWriter(new OutputStreamWriter(System.out));}public String nextLine() throws IOException{return bf.readLine();}public String next() throws IOException{while(!st.hasMoreTokens()){st=new StringTokenizer(bf.readLine());}return st.nextToken();}public char nextChar() throws IOException{//确定下一个token只有一个字符的时候再用return next().charAt(0);}public int nextInt() throws IOException{return Integer.parseInt(next());}public long nextLong() throws IOException{return Long.parseLong(next());}public double nextDouble() throws IOException{return Double.parseDouble(next());}public float nextFloat() throws IOException{return Float.parseFloat(next());}public byte nextByte() throws IOException{return Byte.parseByte(next());}public short nextShort() throws IOException{return Short.parseShort(next());}public BigInteger nextBigInteger() throws IOException{return new BigInteger(next());}public void println() throws IOException {bw.newLine();}public void println(int[] arr) throws IOException{for (int value : arr) {bw.write(value + " ");}println();}public void println(int l, int r, int[] arr) throws IOException{for (int i = l; i <= r; i ++) {bw.write(arr[i] + " ");}println();}public void println(int a) throws IOException{bw.write(String.valueOf(a));bw.newLine();}public void print(int a) throws IOException{bw.write(String.valueOf(a));}public void println(String a) throws IOException{bw.write(a);bw.newLine();}public void print(String a) throws IOException{bw.write(a);}public void println(long a) throws IOException{bw.write(String.valueOf(a));bw.newLine();}public void print(long a) throws IOException{bw.write(String.valueOf(a));}public void println(double a) throws IOException{bw.write(String.valueOf(a));bw.newLine();}public void print(double a) throws IOException{bw.write(String.valueOf(a));}public void print(char a) throws IOException{bw.write(String.valueOf(a));}public void println(char a) throws IOException{bw.write(String.valueOf(a));bw.newLine();}}
}

感谢这位大佬的博文启发icon-default.png?t=N7T8https://blog.csdn.net/TheWayForDream/article/details/118436732

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/666184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十二讲_JavaScript浏览器对象模型BOM

JavaScript浏览器对象模型BOM 1. 浏览器对象模型介绍2. location2.1 常用的属性2.2 常用的方法 3. navigator3.1 常用的属性 4. history4.1 常用的方法&#xff1a; 5. 本地存储 1. 浏览器对象模型介绍 BOM(Browser Object Model) 是指浏览器对象模型&#xff0c;浏览器对象模…

Git--07--GitExtension

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、GitExtension下载GitExtension官网下载教程 二、GitExtension安装三、GitExtension配置四、GitExtension使用 一、GitExtension下载 官网下载&#xff1a; http…

Hive 主要内容一览

Hive架构 用户接口&#xff1a;Client CLI&#xff08;command-line interface&#xff09;、JDBC/ODBC(jdbc访问hive) 元数据&#xff1a;Metastore 元数据包括&#xff1a;表名、表所属的数据库&#xff08;默认是default&#xff09;、表的拥有者、列/分区字段、表的类型&am…

Mybatis基础教程及使用细节

本篇主要对Mybatis基础使用进行总结&#xff0c;包括Mybatis的基础操作&#xff0c;使用注解进行增删改查的练习&#xff1b;详细介绍xml映射文件配置过程并且使用xml映射文件进行动态sql语句进行条件查询&#xff1b;为了简化java开发提高效率&#xff0c;介绍一下依赖&#x…

【chisel】 环境,资料

Chisel环境搭建教程&#xff08;Ubuntu&#xff09; 根据上边的link去安装&#xff1b; 目前scala最高版本用scala-2.13.10,太高了 没有chisel的库文件支持&#xff1b;会在sbt下载的过程中报错&#xff1b; [error] sbt.librarymanagement.ResolveException: chisel chisel目…

爬虫学习笔记-scrapy安装及第一个项目创建问题及解决措施

1.安装scrapy pycharm终端运行 pip install scrapy -i https://pypi.douban.com/simple 2.终端运行scrapy startproject scrapy_baidu,创建项目 问题1:lxml版本低导致无法找到 解决措施:更新或者重新安装lxml 3.项目创建成功 4.终端cd到项目的spiders文件夹下,cd scra…

国标GB/T 28181详解:设备视音频文件检索消息流程

目 录 一、设备视音频文件检索 二、设备视音频文件检索的基本要求 三、命令流程 1、流程图 2、流程描述 四、协议接口 五、产品说明 六、设备视音频文件检索的作用 七、参考 在国标GBT28181中&#xff0c;定义了设备视音频文件检索消息的流程&#xff0c;主…

【C++】C++入门— 类与对象初步介绍

C入门 1 认识面向对象2 类的引入3 类的定义类的定义方式 4 类的访问限定符及封装访问限定符封装 Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;下一篇文章见&#xff01;&#xff01;&#xff01; 1 认识面向对象 C语言是面向过程的&#xff0c;关注…

【GameFramework框架】二、GameFramework框架介绍

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a; https://blog.csdn.net/q7…

Python—数据可视化Seaborn大全:参数详解与实战案例全解析【第52篇—python:Seaborn大全】

文章目录 Seaborn库常用绘图详解与实战引言安装与导入一、散点图参数说明实战案例 二、直方图参数说明实战案例 三、线性关系图参数说明实战案例 四、热力图参数说明实战案例 五、分布图参数说明实战案例 六、箱线图参数说明实战案例 七、联合分布图参数说明实战案例 八、小提琴…

护眼灯几a级的好?最佳的AA级护眼台灯推荐

玩文字游戏&#xff0c;有些商家都是大师级的。我们在各电商平台挑选护眼灯时&#xff0c;都会看到这样一种宣传描述&#xff1a;AAA级全光谱或AAA级健康照明等3个A的字眼。不良品牌厂商在虚假宣传&#xff0c;将国际照明委员会对台灯光线的一个健康认证&#xff0c;也就是AAA级…

网络服务综合实验项目

目录 实验要求 运行环境 基础配置 业务需求 实验步骤 一、基础配置 1.1、配置静态IP 1.1.1、 在192.168.159.130中配置 1.1.2、 在192.168.159.131中配置 ​编辑 1.2、修改主机名及hosts映射 1.2.1、在192.168.159.130中配置 1.2.2、 编辑配置hosts文件 1.2.3、重启…

LangChain 80 LangGraph 从入门到精通二

LangChain系列文章 LangChain 60 深入理解LangChain 表达式语言23 multiple chains链透传参数 LangChain Expression Language (LCEL)LangChain 61 深入理解LangChain 表达式语言24 multiple chains链透传参数 LangChain Expression Language (LCEL)LangChain 62 深入理解Lang…

深度神经网络加载 Caffe 框架模型

介绍 在本教程中&#xff0c;您将学习如何使用来自 Caffe 模型库的 GoogLeNet 训练网络opencv_dnn模块进行图像分类。 我们将在下图中演示此示例的结果。 暴风雪号航天飞机 源代码 我们将使用示例应用程序中的片段&#xff0c;可以在此处下载。 ​ #include < fstream>…

双目模组 - IMSEE SDK的配置实践:含Opencv的详细编译配置

IMSEE 的环境要求: CMake(3.0以上)(需要支持vs2019) Visual Studio 2019 opencv3.3.1 IMSEE-SDK 官网参考: Windows 源码安装 — IMSEE SDK 1.4.2 文档 (imsee-sdk-docs.readthedocs.io) 【案】按照IMSEE的建议进行安装: 1 Windows 安装: 1.1 环境准备: 1.1.1 CMake:in…

多维时序 | Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序列预测

多维时序 | Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序列预测 目录 多维时序 | Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序…

springboot整合Sa-Token实现登录认证和权限校验(万字长文)

目前在国内的后端开发中&#xff0c;常用的安全框架有spring security、shiro。现在&#xff0c;介绍一款由国人开发的安全框架Sa-Token。这个框架完全由国人开发&#xff0c;所提供的Api文档和一些设置都是比较符合国人的开发习惯的&#xff0c;本次就来介绍一下如何在spring …

Multisim14.0仿真(四十五)AC220V转DC12V稳压电源设计

一、仿真原理图&#xff1a; 二、运行效果&#xff1a;

【Vue】组件间通信的7种方法(全)

目录 组件之前的通信方法 1. props/$emit 2.parent/children 3.ref 4.v-model 5.sync 6.attrs,attrs,attrs,listeners 7.provide/inject 7.eventBus 组件之前的通信方法 1. props/$emit 父传子 props 这个只能够接收父组件传来的数据 不能进行修改 可以静态传递 也可…

机器学习系列——(九)决策树

简介 决策树作为机器学习的一种经典算法&#xff0c;在数据挖掘、分类和回归等任务中广泛应用。本文将详细介绍机器学习中的决策树算法&#xff0c;包括其原理、构建过程和应用场景。 原理 决策树是一种基于树状结构的监督学习算法&#xff0c;它通过构建一棵树来对数据进行分…