I Hate It HDU - 1754(線段樹)

題目鏈接

很多學校流行一種比較的習慣。老師們很喜歡詢問,從某某到某某當中,分數最高的是多少。
這讓很多學生很反感。

不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫一個程序,模擬老師的詢問。當然,老師有時候需要更新某位同學的成績。
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

Hint
Huge input,the C function scanf() will work better than cin

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define maxn 200010
using namespace std;
int tree[4*maxn];
int ans=-1;
void build(int node,int l,int r)
{
    if(l==r)
    {
        scanf("%d",&tree[node]);
        return;
    }
    int mid=(l+r)/2;
    build(node*2,l,mid);//遞歸構造左兒子結點
    build(node*2+1,mid+1,r);//遞歸構造右兒子結點
    tree[node]=max(tree[node*2],tree[node*2+1]);//更新父結點
}
void update(int node,int l,int r,int index,int n)
{//node爲結點下標,l,r爲結點區間,index爲數組下標,n爲要加上的值
    if(l==r)//如果遇到葉子結點即爲我們要更新的結點
    {
        tree[node]=n;
        return;
    }//如果不是葉子結點,則向子節點遞歸
    int mid=(l+r)/2;
    if(index<=mid)
        update(node*2,l,mid,index,n);
    else
        update(node*2+1,mid+1,r,index,n);
    tree[node]=max(tree[node*2],tree[node*2+1]);//更新完子節點後,更新父(當前)結點的值
}
int query(int node,int l,int r,int L,int R)
{//node爲結點下標,[L,R]爲要查詢的區間,[l,r]爲結點(目標)區間,
    if(l<=L&&r>=R)
        return tree[node];
    int mid=(L+R)/2;
    if(l<=mid)
        ans=max(ans,query(node*2,l,r,L,mid));
    if(mid<r)
        ans=max(ans,query(node*2+1,l,r,mid+1,R));
    return ans;//返回一個整數,參數需要所求區間的左邊界l,右邊界r
}
int main()
{
    int N,M;
    while(scanf("%d%d",&N,&M)!=EOF)
    {
        memset(tree,0,sizeof(tree));
        build(1,1,N);
        while(M--)
        {
            char c;
            int a,b;
            scanf(" %c%d%d",&c,&a,&b);
            if(c=='Q')
            {
                printf("%d\n",query(1,a,b,1,N));
                ans=-1;
            }
            else if(c=='U')
                update(1,1,N,a,b);
        }
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章