树状数组相关

前置细节 

  • 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…

Unity中的GUI

GUI&#xff1a;游戏用户交互界面&#xff0c;一个代码驱动的UI系统 GUI的主要作用 1、作为程序员的调试工具 2、为脚本组件创建自定义监视面板 3、创建新的编辑器窗口和工具以拓展Unity本身(一般作为内置游戏工具) GUI工作原理 1、OnGUI是每帧执行&#xff0c;相当于专门绘…

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…

C语言实现网络爬虫

我常使用C语言写网络爬虫&#xff0c;能够将网页爬出来&#xff0c;但是&#xff0c;图片却爬不出来&#xff0c;有没有大佬帮解决一下&#xff01;&#xff01;&#xff01; 代码&#xff1a; #include <stdio.h> #include<string.h> #include<WinSock2.h>…

【大厂AI课学习笔记】1.4 算法的进步(5)关于GPU

——关于GPU GPU&#xff0c;即图形处理器&#xff0c;最初是为了加速计算机图形处理而设计的。然而&#xff0c;随着时间的推移&#xff0c;研究人员发现GPU的并行处理能力非常适合执行深度学习中的大规模矩阵运算。这一点在吴恩达教授的论文中得到了充分体现&#xff0c;他利…

Vue中间件的讲解案例分析

Vue中间件的讲解案例分析 1. Axios中间件&#xff1a; Axios是一个常用的HTTP客户端&#xff0c;可以与Vue结合使用&#xff0c;处理网络请求和数据获取。您可以创建一个Axios实例&#xff0c;并将其作为Vue的原型属性或插件使用&#xff0c;以便在整个应用程序中共享和使用。…

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

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

Remote development in WSLWSL 中的远程开发

This tutorial walks you through enabling Windows Subsystem for Linux (WSL) and running Visual Studio Code in WSL using the WSL extension. 本教程将指导你启用适用于 Linux 的 Windows 子系统 &#xff08;WSL&#xff09; 并使用 WSL 扩展在 WSL 中运行 Visual Studi…

【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…

前端html+css笔记

前端 Html: html标签 < strong >加粗 --文本格式化标签 < em >倾斜 < ins >下划线 < del >删除 < img src“图片的url” >src用于指定图像的位置名称(属性名属性值属性) alt 替换文本title 提示文本width 图片宽度 < a href“”>…

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>…