HDU 1754

Description
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。

不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。

Input
本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 N 和 M ( 0

import java.util.Scanner;

public class ProbelmB {

        private static final int MAX_NUM = 1000000;
        private static int[] tree  = new int[MAX_NUM];
        private static  Scanner scaner ;
        public static void main(String[] args) {
            scaner = new Scanner(System.in);
            while(scaner.hasNext()) {
                int num = scaner.nextInt();
                int number = scaner.nextInt();
                 buildTree(1,num,1);
                 while(number-- !=0) {
                     String flag = scaner.next();
                     int a = scaner.nextInt();
                     int b = scaner.nextInt();
                     if (flag.equals("Q")) {
                        System.out.println(query(a,b,1,num,1));
                     }else{
                        updata(a,b,1,num,1);
                     }
                 }

            }
            scaner.close();
        }
        /*
        构建线段树
        */
        private static void buildTree(int left,int right,int root) {
            if(left == right) {
                tree[root] = scaner.nextInt();
                return ;
            }else{
            int mid = (left+right) >> 1;
            buildTree(left,mid,root<<1); //左边递归
            buildTree(mid + 1,right,root << 1 | 1);
            tree[root] = Math.max(tree[root<<1],tree[root<<1 | 1]); //在两个子节点中选取最大值

        }

        }

  /*
  点更新
  */
        private static void updata(int point,int value,int left,int right,int root) {
            if (left == right) {
                tree[root] = value; //当left == right 时 将值赋给对应点,然后回溯更新节点的值
                return ;
            }else{
            int mid = (left + right) >> 1;
            if (point <= mid) {
                updata(point,value,left,mid,root <<1);
            }else{
                updata(point,value,mid+1,right,root << 1 | 1);
            }
            tree[root] = Math.max(tree[root<<1],tree[root<<1 | 1]);
        }
        }
        /*
        查询区间的最大值
        */
        private static  int query(int L,int R,int left,int right,int root) {
            if (L <= left && right <= R) {
                return tree[root];
            }else{
                int sum = 0,mid = (left +right)>>1;

                if (L <= mid ) { //在两边找最大值,
                    sum = Math.max(sum,query(L,R,left,mid,root << 1 ));

                }
                if (R > mid) {
                    sum = Math.max(sum,query(L,R,mid+1,right,root<<1 |1));
                }
            return sum;
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值