首页 > 编程语言 >JAVA线段树模板

JAVA线段树模板

时间:2022-09-21 10:13:38浏览次数:82  
标签:node right JAVA int 线段 tree mid 模板 left

public class LineTree{
    int[] tree,nums;
    int n;
    public LineTree(int[] nums){
        this.nums = nums;
        n = nums.length;
        tree = new int[n*4];
        build(0, 0, n-1);
    }

    // 建立线段树
    private void build(int node, int left, int right){
        if(left == right){
            tree[node] = nums[left];
        }
        int mid = left + ((left + right)>> 1);
        build(2*node + 1, left, mid);
        build(2*node + 2, mid + 1, right);
        tree[node] = tree[2*node + 1] + tree[2*node + 2];
    }

    // 更新线段树
    public void update(int node, int left, int right, int idx, int val){
        if(left > right) return;
        else if(left == right){
            nums[left] = val;
            tree[node] = val;
        }else{
            int mid = left + ((left + right)>> 1);
            if(idx >= left && idx <= mid)
                update(node * 2 + 1, left, mid, idx, val);
            else
                update(node * 2 + 2, mid + 1, right, idx, val);
            tree[node] = tree[node*2 + 1] + tree[node*2 + 2];
        }
    }

    // 查询线段树
    public int query(int node, int left, int right, int L, int R){
        if(right < L || left > R) return 0;
        else if(left == right) return tree[node];
        else if(L<= left && R >= right)return tree[node];
        else{
            int mid = left + ((right - left) >> 1);
            return query(node*2+1, left, mid,L,R) + query(node*2+2, mid+1, right, L, R);
        }
    }
}

标签:node,right,JAVA,int,线段,tree,mid,模板,left
From: https://www.cnblogs.com/tutaotao/p/16714615.html

相关文章

  • 探索Java8:(五)Supplier和Consumer接口的使用
    Supplier是函数式编程的另一个接口,与Function、Predicate接口类似,区别在于Supplier不接收任何参数,只返回结果。Supplier的基本使用@FunctionalInterfacepublicinterfac......
  • java中IO流-缓冲流(字节型)复制操作
    importjava.io.*;publicclassBufferedTest{publicstaticvoidmain(String[]args){FileInputStreamfis=null;FileOutputStr......
  • java学习笔记day01
    笔记基础语法一、注释单行注释://123123多行注释:/*多行注释*/文档注释:/***@Description111*@Author111*/二、基本数据类型1、数据存储的单位​ 位、......
  • java中IO流字节的读入与复制操作
    importjava.io.*;importorg.junit.Test;/**FileInputStream和FileOutputStream的使用*/publicclassFileInputOutputStreamTest{//使用字节流File......
  • 【Java UI】HarmonyOS添加日历事件
    ​参考资料CalendarDataHelperEventsRemindersapi讲解添加权限在config.json添加权限代码如下"reqPermissions":[{"name":"ohos.permission.RE......
  • JAVA进阶--XML、XML解析、XPath、设计模式--2022年9月19日
    第一节1、XML是什么?XML的全称为(EXtensibleMarkupLanguage),是一种可扩展的标记语言它是一种数据表示格式,可以用于自定义数据格式2、......
  • Java第一课
    一、java的运行假设有一个文件为HelloWorld.java运行java的过程为1、执行命令:javacHelloWorld.java这里javac是java编译器,将文件HelloWorld.java编译成HelloWorld.cla......
  • Java【Mybatis】——创建Mybatis Mapper模板
    目的在编码过程中,我们常常需要写一些配置文件。而这些配置文件的格式都是固定的——关键是我通常记不住,也是找地方复制。这种方法可以,但没有必要。因为一种方式,更简便—......
  • JavaWeb-SMBMS项目
    JavaWeb-SMBMS项目:学习视频-狂神说JavaWeb:视频链接JavaWeb-SMBMS项目一、SMBMSSMBMS模块数据库架构项目如何搭建?考虑是不是用maven?jar包,依赖二、项目搭建准备......
  • C++05_模板元编程
    模板函数为什么需要模板函数(template)避免重复写代码inttwice(inti){returni*2;}floattwice(floatf){returnf*2;}doubletwice(doubled)......