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);
        }
    }
}
原文地址:https://www.cnblogs.com/zyb993963526/p/6545008.html