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

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

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

    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。 

    思路:

    比较基础的线段树题目。

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    const int maxn = 800010;
    
    int n, m;
    
    struct node
    {
        int l, r;
        int num;
    }stu[maxn];
    
    char s;
    int ans;
    
    void init(int l,int r,int k)
    {
        stu[k].l = l;
        stu[k].r = r;
        stu[k].num = 0;
    
        if(l==r)   return;
    
        int mid = (l + r) / 2;
        init(l, mid, 2 * k);
        init(mid + 1, r, 2 * k + 1);
    }
    
    void update(int x, int i, int k)
    {
        if (stu[k].l == stu[k].r && stu[k].l == i)
        {
            stu[k].num = x;
            return;
        }
        int mid = (stu[k].l + stu[k].r) / 2;
        if (i <= mid)  update(x, i, 2 * k);
        else           update(x, i, 2 * k + 1);
        stu[k].num = max(stu[2 * k].num , stu[2 * k + 1].num);
    }
    
    
    void search(int l,int r,int k)
    {
        if (stu[k].l == l && stu[k].r == r)
        {
            ans = max(ans, stu[k].num);
            return;
        }
        int mid = (stu[k].l + stu[k].r) / 2;
        if (r <= mid)      search(l, r, 2 * k);
        else if(l > mid)   search(l, r, 2 * k + 1);
        else
        {
            search(l, mid, 2 * k);
            search(mid + 1, r, 2 * k + 1);
        }
    }
    
    int main()
    {
        //freopen("D:\txt.txt", "r", stdin);
        int x, y;
        while (~scanf("%d%d", &n, &m))
        {
            init(1, n, 1);
            int a;
            for (int i = 1; i <= n; i++)
            {
                scanf("%d", &a);
                update(a, i, 1);
            }
            while (m--)
            {
                getchar();
                scanf("%c", &s);
                scanf("%d%d", &x, &y);
                if (s == 'Q')
                {
                    ans = -1;
                    search(x, y, 1);
                    printf("%d
    ", ans);
                }
                else
                    update(y, x, 1);
            }
        }
    }
  • 相关阅读:
    web app变革之rem
    理解angularjs的作用域
    移动开发框架
    angularjs ng-repeat下验证问题
    10、长链接转短链接
    8、自定义菜单及菜单响应事件的处理
    9、多公众号集中管理
    7、消息管理-接收事件推送
    6、消息管理-普通消息接受处理
    5、用户和用户组管理-支持同步
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/6545008.html
Copyright © 2011-2022 走看看