zoukankan      html  css  js  c++  java
  • HDU-1754 I Hate It ( 线段树 )

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1754

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

    不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
     
    Input
    本题目包含多组测试,请处理到文件结束。
    在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目。
    学生ID编号分别从1编到N。
    第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。
    接下来有M行。每一行有一个字符 C (只取'Q'或'U') ,和两个正整数A,B。
    当C为'Q'的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。
    当C为'U'的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。
     
    Output
    对于每一次询问操作,在一行里面输出最高成绩。
     
    Sample Input
    5 6
    1 2 3 4 5
    Q 1 5
    U 3 6
    Q 3 4
    Q 4 5
    U 2 9
    Q 1 5
     
    Sample Output
    5
    6
    5
    9
     
    单点更新,没什么坑点。
    之前都是用指针写得的树,尝试一下用数组写的。
     
     1 #include<iostream>
     2 using namespace std;
     3 
     4 const int MAX = 200005;
     5 class Node{
     6 public:
     7     int l,r,v;
     8 }node[MAX * 3];
     9 int num[MAX];
    10 
    11 int max( int a,int b ){
    12     return a > b ? a : b;
    13 }
    14 
    15 void Creat( int i, int z, int y ){
    16     node[i].l = z;
    17     node[i].r = y;
    18     
    19     if( z == y ){
    20         node[i].v = num[z];
    21         return;
    22     }
    23 
    24     int mid = ( z + y ) >> 1;
    25     Creat( i << 1, z, mid );
    26     Creat( ( i << 1 ) + 1, mid + 1, y );
    27     node[i].v = max( node[i << 1].v, node[( i << 1 ) + 1].v );
    28 }
    29 
    30 void Insert( int i, int x, int n ){
    31     if( node[i].l == node[i].r ){
    32         node[i].v = n;
    33         return;
    34     }
    35 
    36     int mid = ( node[i].l + node[i].r ) >> 1;
    37     if( x <= mid ) Insert( i << 1, x, n );
    38     else Insert( ( i << 1 ) + 1, x, n );
    39 
    40     node[i].v = max( node[i << 1].v, node[( i << 1 ) + 1].v );
    41 }
    42 
    43 int Ask( int i, int z, int y ){
    44     if( node[i].l == z && node[i].r == y )
    45         return node[i].v;
    46 
    47     int mid = ( node[i].l + node[i].r ) >> 1;
    48 
    49     if( y <= mid )
    50         return Ask( i << 1, z, y );
    51     else if( z > mid )
    52         return Ask( ( i << 1 ) + 1, z, y );
    53     else 
    54         return max( Ask( i << 1, z, mid ), Ask( ( i << 1 ) + 1, mid + 1, y ) );
    55 }
    56 
    57 int main(){
    58     ios::sync_with_stdio( false );
    59     
    60     int N, M;
    61     while( cin >> N >> M ){
    62         
    63         for( int i = 1; i <= N; i++ )
    64             cin >> num[i];
    65         Creat( 1, 1, N );
    66 
    67         char k;
    68         int a, b;
    69 
    70         for( int i = 1; i <= M; i++ ){
    71             cin >> k >> a >> b;
    72 
    73             if( k == 'Q' ) cout << Ask( 1, a, b) << endl;
    74             else Insert( 1, a, b );
    75         }
    76     }
    77     return 0;
    78 }
  • 相关阅读:
    git初学【常用命令、上传项目到码云或从码云拉取、克隆项目】
    dedecms自学
    sublime3使用笔记
    路由功能
    bootstrap模态框篇【遇到的问题】
    justgage.js的使用
    fullpage.js使用方法
    js&jq遇到的问题(不断更新中)
    图灵完备——停机问题
    中断
  • 原文地址:https://www.cnblogs.com/hollowstory/p/5331041.html
Copyright © 2011-2022 走看看