首页 > 其他分享 >树状数组求区间最大小值

树状数组求区间最大小值

时间:2024-09-10 19:35:14浏览次数:5  
标签:return 树状 int lowbit 小值 数组 INF fimn trmn

const int N=5e5+5;
const int INF=0x3f3f3f3f;
int n,q;
int a[N],trmx[N],trmn[N];
//将原来的累加改为求最值
void add(int x,int k){
    while(x<=n){
        trmx[x]=max(trmx[x],k);
        trmn[x]=min(trmn[x],k);
        x+=lowbit(x);
    }
}
//区间查询最大/小值
int fimx(int x,int y){
    if(y>x){
        if(y-lowbit(y)>x){
            return max(trmx[y],fimx(x,y-lowbit(y)));
        }
        else{
            return max(a[y],fimx(x,y-1));
        }
    }
    return a[x];
}

int fimn(int x,int y){
    if(y>x){
        if(y-lowbit(y)>x){
            return min(trmn[y],fimn(x,y-lowbit(y)));
        }
        else{
            return min(a[y],fimn(x,y-1));
        }
    }
    return a[x];
}

void solve(){
    memset(trmn,INF,sizeof trmn);//求最小值记得初始化INF
    cin>>n>>q;
	for(int i=1;i<=n;i++){
        cin>>a[i];
        add(i,a[i]);
    }

    while(q--){
        int l,r;cin>>l>>r;
        cout<<fimx(l,r)-fimn(l,r)<<endl;
    }
}

标签:return,树状,int,lowbit,小值,数组,INF,fimn,trmn
From: https://www.cnblogs.com/TaopiTTT/p/18407031

相关文章

  • 基于数组的循环队列
    基于数组的循环队列关键点在于:当元素总数超过队列长度后,出队、入队等行为如何避免数组越界问题。环绕数组的逻辑结构确实可以类比时钟,当指针走到最后一个刻度(比如12小时制的12点),再往前走时,指针会回到最开始的刻度(即1点),而不是继续前进到一个不存在的位置。 以12小时制时钟为......
  • 力扣热题100 - 二叉树:将有序数组转换为二叉搜索树
    题目描述:题号:108给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。解题思路:思路一:中序构建二叉树选择根节点:首先,选择数组的中间元素作为根节点。这样做可以确保生成的二叉搜索树尽可能平衡。递归构建子树:将数组分......
  • LeetCode之数组/字符串
    88.合并两个有序数组classSolution{publicvoidmerge(int[]nums1,intm,int[]nums2,intn){//这个循环将nums2中的元素逐个复制到nums1中从索引m开始的位置for(inti=0;i<n;i++){nums1[i+m]=nums2[i];......
  • [Python手撕]螺旋数组
    classSolution:defspiralOrder(self,matrix:List[List[int]])->List[int]:res=[]left=0right=len(matrix[0])-1down=len(matrix)-1up=0whileleft<=rightandup<=down:......
  • 【useTranslation】兼容数组解构和对象解构的三种实现方式
    useTranslation使用:数组解构:const[t,i18n]=useTranslation();对象解构:const{t,i18n}=useTranslation();useTranslation兼容数组解构和对象解构的三种实现方式:1.返回带属性的数组在这种实现方式中,返回一个数组,并为该数组添加对象属性。这样可以同时使用数组......
  • js对象转数组对象
    1.创建一个baseFun.jsexportfunctionobjectFun(obj){constresult=[]//处理所有可能的JSON字符串字段,递归处理所有嵌套JSON字符串functionprocessJsonFields(obj){for(constkeyinobj){if(obj.hasOwnProperty(key)){......
  • array数组对象以及常用方法
    数组(Array)是一种数据结构,用于存储具有相同类型的数据元素的有序集合。1.定义数组//通过字面量方式定义数组:let 数组名=[值,值,值];letnumbers=[1,2,3,4,5];//通过构造函数定义数组:let数组名=newArray(值,值,值);(newArray()是固定写法)letfr......
  • C语言程序设计——数组(二)
    一、字符数组1.1字符数组的定义定义方法与数组(一)介绍的类似。用来存放字符数据的数组是字符数组。字符数组中的一个元素存放一个字符。1.2字符数组的初始化对字符数组初始化,最容易理解的方式是逐个字符赋给数组中各元素。注:①如果在定义字符数组时不进行初始化,则数组中各......
  • Leetcode3264. K 次乘运算后的最终数组 I
    EverydayaLeetcode题目来源:3264.K次乘运算后的最终数组I解法1:模拟操作:遍历数组nums,找到其中的最小值x,如果存在多个最小值,选择最前面的一个。将它乘以multiplier。共执行k次操作。代码:/**@lcapp=leetcode.cnid=3264lang=cpp**[3264]K次乘运算......
  • 2024-09-04:用go语言,给定一个长度为n的数组 happiness,表示每个孩子的幸福值,以及一个正
    2024-09-04:用go语言,给定一个长度为n的数组happiness,表示每个孩子的幸福值,以及一个正整数k,我们需要从这n个孩子中选出k个孩子。在筛选过程中,每轮选择一个孩子时,所有尚未选中的孩子的幸福值都会减少1。需要注意的是,幸福值不能降低到负数,只有在其为正数时才能减少。我们的目标是尽可......