hdu-1754 I Hate It

題目連接:php

http://acm.hdu.edu.cn/showproblem.php?pid=1754測試

題目類型:ui

圖論-線段樹spa

題意歸納:code

有N個學生M次操做,而後給出N個學生的成績,若是輸入Q A B,那麼輸出ID爲A~B之間的學生中成績最高的是多少,若是輸入U A B,則將ID爲A的學生成績改成B。blog

解題思路:ip

線段樹模板。get

題目:it

I Hate It

Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 75924    Accepted Submission(s): 29275


io

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
# include <stdio.h>
# define MAX 2000000

int x[MAX+10];

struct tree{
    int l,r,m,s;
}tr[MAX*4];

int max(int a,int b)
{
    if(a>b)
        return a;
    else
        return b;
}

int build(int a,int b,int r)//創建一個二叉樹 
{
    if(a==b)
    {
        tr[r].l=tr[r].r=a;
        tr[r].s=x[a];
        return tr[r].s;
    }
    tr[r].l=a;
    tr[r].r=b;
    tr[r].m=(a+b)/2;
    
    tr[r].s=max( build(a,tr[r].m,2*r) , build(tr[r].m+1,b,2*r+1) );
    return tr[r].s; 
}

void updata(int a,int x,int r)//更新 
{
    if( tr[r].l==a && tr[r].r==a)
    {
        tr[r].s=x;
        return ;
    }
    if(a>tr[r].m)
    {
        updata(a,x,2*r+1);
        tr[r].s=max( tr[2*r].s , tr[2*r+1].s );
    }
    else
    {
        updata(a,x,2*r);
        tr[r].s=max( tr[2*r].s , tr[2*r+1].s );
    }
}

int querry(int a,int b,int r)
{
    if(tr[r].l==a && tr[r].r==b)
        return tr[r].s;
    else if(a>tr[r].m)
        return querry(a,b,2*r+1);
    else if(b<=tr[r].m)
        return querry(a,b,2*r);
    else 
        return max( querry(a,tr[r].m,2*r), querry(tr[r].m+1,b,2*r+1));
}

int main ()
{
    int i,m,n,z,y;
    char ch;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=1;i<=n;i++)
            scanf("%d",&x[i]); 
        build(1,n,1);
        for(i=1;i<=m;i++)
        {
            getchar();
            scanf("%c %d %d",&ch,&z,&y);
            if(ch=='Q')
                printf("%d\n",querry(z,y,1));
            else
                updata(z,y,1);
        }
    }
    return 0;
 }
相關文章
相關標籤/搜索