关闭

HDU 1754

726人阅读 评论(0) 收藏 举报
分类:

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

    }
}
2
0
查看评论

HDU 1754 树状数组 解法

要询问一个数列的某区间的最大值,其中会更新数据。 这样的题目使用树状数组是可以的,但是因为要牵涉到区间操作,故此还是线段树比较好点。 不过使用树状数组也是可以的,就是查询的时候麻烦点,注意计算,不要超出区间了。 看下面的query函数,这是主要的难点函数,其中的-1操作和这个判断r -...
  • kenden23
  • kenden23
  • 2014-06-06 20:47
  • 892

hdu1754 I hate it (线段树)

I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 55291 Accepted Submission(s): 21...
  • d_x_d
  • d_x_d
  • 2015-12-11 11:10
  • 2122

hdu-1754 I Hate It(线段树求区间最大值)

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 57540 ...
  • acm_cxq
  • acm_cxq
  • 2016-03-15 13:14
  • 558

杭电 hdu 1754 I Hate It (线段树 + 详细注释)

/* THE PROGRAM IS MADE BY PYY */ /*----------------------------------------------------------------------------// Copyright (c) 2011 pan
  • panyanyany
  • panyanyany
  • 2011-09-14 22:23
  • 5884

hdu1754(线段树单点更新)

链接:点击打开链接 题意:本题目包含多组测试,请处理到文件结束, 在每个测试的第一行,有两个正整数N和M(0 学生ID编号分别从1编到N 第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩 接下来有M行.每一行有一个字符C(只取'Q'或'U&#...
  • stay_accept
  • stay_accept
  • 2015-08-07 18:23
  • 536

HDU1754【分块入门1】

k..
  • KEYboarderQQ
  • KEYboarderQQ
  • 2017-04-30 20:42
  • 265

【hdu1754】树状数组 区间最值

I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 66880 Accepted Submissio...
  • u011327397
  • u011327397
  • 2016-10-19 08:47
  • 175

HDU 1754(zkw线段树-区间最值)

I Hate It Problem Description 很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。 这让很多学生很反感。 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位...
  • nike0good
  • nike0good
  • 2012-11-18 08:57
  • 1561

杭电 HDU ACM 1754 I Hate It (线段树)

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 47272 &#...
  • lsgqjh
  • lsgqjh
  • 2015-07-01 10:13
  • 847

HDU 1754 单点更新 区间求和 zkw线段树 + 递归线段树

HDOJ 1754 线段树裸题,直接上代码。 AC code: 递归线段树: //lrl's submission #include #include #include using namespace std; #define debug 0 #de...
  • ADjky
  • ADjky
  • 2016-09-14 13:03
  • 322
    个人资料
    • 访问:112187次
    • 积分:1387
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:3篇
    • 译文:0篇
    • 评论:32条
    博客专栏
    最新评论