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

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    这是一个单点更新、区间查询的线段树,AC代码如下:

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 const int maxi = 204567;
     7 int segTree[maxi<<2];
     8 int arr[maxi];
     9 
    10 void PushUp(int node) {
    11     segTree[node] = max(segTree[node<<1], segTree[node<<1|1]);
    12 }
    13 
    14 void build(int node, int l, int r) {
    15     if(l==r) segTree[node] = arr[l];
    16     else {
    17         int mid = (l+r)>>1;
    18         build(node<<1, l, mid);
    19         build(node<<1|1, mid+1, r);
    20         PushUp(node);
    21     }
    22 }
    23 
    24 int query(int node, int l, int r, int L, int R) {
    25     if(L<=l && r<=R) return segTree[node];
    26     int mid = (l+r)>>1, ans = 0;
    27     if(L<=mid) ans = max(ans, query(node<<1, l, mid, L, R));
    28     if(R>=mid+1) ans = max(ans, query(node<<1|1, mid+1, r, L, R));
    29     return ans;
    30 }
    31 
    32 void update(int node, int l, int r, int c, int d) {
    33     if(l==r) segTree[node] = d;
    34     else {
    35         int mid = (l+r)>>1;
    36         if(c <= mid) update(node<<1,l,mid,c,d);
    37         else update(node<<1|1,mid+1,r,c,d);
    38         PushUp(node);
    39     }
    40 }
    41 
    42 int main() {
    43     int n,m;
    44     while(~scanf("%d %d",&n,&m)) {
    45         memset(segTree,0, sizeof(segTree));
    46         for(int i =1; i <= n; i++) {
    47             scanf("%d",&arr[i]);
    48             getchar();
    49         }
    50         build(1,1,n);
    51         while(m--) {
    52             int a,b;
    53             char c;
    54             scanf("%c %d %d",&c,&a,&b);
    55             getchar();
    56             if(c=='Q') printf("%d
    ",query(1,1,n,a,b));
    57             else update(1,1,n,a,b);
    58         }
    59     }
    60     return 0;
    61 }

    希望有所帮助~ 谢谢

  • 相关阅读:
    Django组件-cookie与session
    Js获取标签高度
    js动态添加事件
    div 显示与隐藏
    JS字符串截取
    网页事件
    js_event.keycode值大全
    DOS删除服务
    判断字符串的编码
    《把时间当作朋友》读书笔记(二)-- 困境
  • 原文地址:https://www.cnblogs.com/magisk/p/8516315.html
Copyright © 2011-2022 走看看