hdu1754(線段樹單點修改,區間查詢最大值)

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1754

I Hate It

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


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 <string.h>  
#include <algorithm>  
#include <stdio.h>  
#include <math.h>  
#include <queue>  
#define MAXN 200010  
#define inf 0x3f3f3f3f  
using namespace std;  
  
struct node{  
    int l,r; 
    int add;  
    int sum;
    int mx;  
    int mn; 
}tree[MAXN<<2]; 
  
void pushup(int index){  
    tree[index].mx = max(tree[index<<1].mx,tree[index<<1|1].mx);   
}  
void pushdown(int index){  
 
    if(tree[index].add){  
        tree[index<<1].mx = tree[index].add; 
        tree[index<<1|1].mx = tree[index].add; 
        tree[index<<1].add = tree[index].add; 
        tree[index<<1|1].add = tree[index].add; 
        tree[index].add = 0;  
    }  
}
void build(int l,int r,int index){  
    tree[index].l = l;  
    tree[index].r = r;  
    tree[index].add = 0;
    if(l == r){  
        scanf("%d",&tree[index].sum);  
        tree[index].mn = tree[index].mx = tree[index].sum;  
        return ;  
    }  
    int mid = (l+r)>>1;  
    build(l,mid,index<<1);  
    build(mid+1,r,index<<1|1);  
    pushup(index);  
}  
void updata(int l,int r,int index,int val){  
    if(l <= tree[index].l && r >= tree[index].r){  
        tree[index].mx = val; 
        tree[index].add = val;
        return ;  
    }  
    pushdown(index);  
    int mid = (tree[index].l+tree[index].r)>>1;  
    if(l <= mid){  
        updata(l,r,index<<1,val);  
    }  
    if(r > mid){  
        updata(l,r,index<<1|1,val);  
    }  
    pushup(index);  
}  
int query(int l,int r,int index){  
    if(l <= tree[index].l && r >= tree[index].r){  
        return tree[index].mx;  
    }  
    pushdown(index);  
    int mid = (tree[index].l+tree[index].r)>>1;  
    int Max = 0;  
    if(l <= mid){    
        Max = max(query(l,r,index<<1),Max);  
    }  
    if(r > mid){  
        Max = max(query(l,r,index<<1|1),Max);  
    }  
    return Max;    
}  
int main()  
{  
    int n,m,x,y,z;
	char q;  
    while(scanf("%d%d",&n,&m)!=EOF)
	{  
        build(1,n,1);  
        while(m--){  
            getchar();
			scanf("%c",&q);  
            if(q == 'Q'){   
                scanf("%d%d",&x,&y);  
                printf("%d\n",query(x,y,1));  
            }  
            else{  
                scanf("%d%d",&x,&z);  
                updata(x,x,1,z);  
            }  
        }  
    }  
    return 0;  
}

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