zoukankan      html  css  js  c++  java
  • 线段树

    object IntervalTree1 extends App
    {
        val score = Array(1, 2, 3, 4, 5)
    
        val commands = Array(
            "Q 1 5", "U 3 6", "Q 3 4",
            "Q 4 5", "U 2 9", "Q 1 5"
        )
    
    
        val (n, m) = (5, 6)
        val iTree = new IntervalTree
    
        var root: Tree = _
        root = iTree.build(1, n)
        //iTree.printTree(root)
    
        commands.foreach( cmd => {
            val tokens = cmd.split(" ")
            val (c, a, b) = (tokens(0), tokens(1).toInt, tokens(2).toInt)
    
            c match {
                case "Q" => println(iTree.query(root, a, b))
                case "U" => {score(a) = b; iTree.update(root, a, b)}
            }
        })
    
    
        class Tree
        {
            var l: Tree = null
            var r: Tree = null
            var lv = 0
            var rv = 0
            var maxscore = 0
        }
    
        class IntervalTree
        {
            var pos = 0
            var nodes = Array.fill(400010)(new Tree())
    
    
            def build(left: Int, right: Int): Tree =
            {
                val node = nodes(pos); pos += 1
                node.lv = left; node.rv = right;
    
                if (left == right) {
                    node.maxscore = Math.max(score(left - 1), score(right - 1))
                    node
                }
                else {
                    val mid = (left + right) >> 1
                    node.l = build(left, mid)
                    node.r = build(mid + 1, right)
                    node.maxscore = Math.max(node.l.maxscore, node.r.maxscore)
                }
                node
            }
    
            def query(root: Tree, left: Int, right: Int): Int =
            {
                if (left == root.lv && right == root.rv) return root.maxscore
    
                val mid = (root.lv + root.rv) >> 1
                mid match {
                    case m if (right <= m) => query(root.l, left, right)
                    case m if (left > m) => query(root.r, left, right)
                    case _ => Math.max(query(root.l, left, mid), query(root.r, mid + 1, right))
                }
            }
    
            def update(root: Tree, value: Int, newValue: Int): Int =
            {
                val mid = (root.lv + root.rv) >> 1
                if (value == root.lv &&  value == root.rv) {
                    root.maxscore = newValue
                    return root.maxscore
                }
    
                val ret = mid match {
                    case m if value <= m => update(root.l, value,  newValue)
                    case m if value > m => update(root.r, value, newValue)
                }
    
                root.maxscore = Math.max(root.maxscore, ret)
                root.maxscore
            }
    
            def printTree(node: Tree)
            {
                if (node != null) {
                    println(s"[${node.lv},${node.rv}]")
                    printTree(node.l)
                    printTree(node.r)
                }
            }
        }
    }
    

      

  • 相关阅读:
    Best Time to Buy and Sell Stock III <leetcode>
    Best Time to Buy and Sell Stock <leetcode>
    Search a 2D Matrix <leetcode>
    Minimum Path Sum <leetcode>
    Container With Most Water <leetcode>
    Binary Tree Level Order Traversal II <leetcode>
    Rotate Image <leetcode>
    获取安装的apk应用信息
    判断wifi连接是否可用
    kubectl常用命令汇总
  • 原文地址:https://www.cnblogs.com/rilley/p/3979568.html
Copyright © 2011-2022 走看看