Fighting

分寸 , 克制

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;
        }

    }
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33048603/article/details/52214325
个人分类: ACM
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

HDU 1754

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭