1. 程式人生 > >HDU-1754 I Hate It(線段樹、點變化+段查詢---模板)

HDU-1754 I Hate It(線段樹、點變化+段查詢---模板)

區間 printf desc d+ ++ pda ava des mission

I Hate It

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


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

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


 

Author
linle
 

Source
2007省賽集訓隊練習賽(6)_linle專場
 

Recommend
lcy
        
題目大意:字面意思。。

解題思路:線段樹模板。要求有兩個:點的值變化,求區間和。直接套模板即可
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=200005;
const int maxn = N*3;
int val[maxn],a[maxn];
int n,m,ql,qr,pos,value;

void build(int num,int l,int r)
{
    if(l==r)
    {
        val[num] = a[l];
        return ;
    }
    int mid = (l+r)/2;
    build(num*2,l,mid);
    build(num
*2+1,mid+1,r); val[num] = max(val[num*2],val[num*2+1]); } int Findmax(int num,int l,int r) { int mid=(l+r)/2; int ans = 0; if(ql<=l&&qr>=r) { return val[num]; } else { if(mid>=ql) ans = max(ans,Findmax(num*2,l,mid)); if(mid<qr) ans = max(ans,Findmax(num*2+1,mid+1,r)); } return ans; } void updata(int num,int l,int r) { if(l==r) { val[num] = value; return ; } int mid = (l+r)/2; if(mid>=pos) { updata(num*2,l,mid); } else { updata(num*2+1,mid+1,r); } val[num] = max(val[num*2],val[num*2+1]); } int main() { while(scanf("%d %d",&n,&m)!=EOF) { for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } build(1,1,n); int A,B;char c; for(int i=1;i<=m;i++) { getchar(); scanf("%c %d %d",&c,&A,&B); if(c==Q) { ql = A; qr = B; printf("%d\n",Findmax(1,1,n)); } else { pos = A; value = B; updata(1,1,n); } } } }

HDU-1754 I Hate It(線段樹、點變化+段查詢---模板)