1. 程式人生 > >HDU1754 —— 線段樹 單點修改及區間最大值

HDU1754 —— 線段樹 單點修改及區間最大值

pre ios -a display 一次 add 分數 線段 play

題目鏈接:https://vjudge.net/problem/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

代碼如下:

技術分享
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6
#include <vector> 7 #include <queue> 8 #include <stack> 9 #include <map> 10 #include <string> 11 #include <set> 12 using namespace std; 13 typedef long long LL; 14 const double EPS = 1e-8; 15 const int INF = 2e9; 16 const LL LNF = 2e18; 17 const int MAXN = 2e5+10
; 18 19 int maxv[MAXN*4]; 20 21 void push_up(int u) 22 { 23 maxv[u] = max(maxv[u*2], maxv[u*2+1]); 24 } 25 26 void add(int u, int l, int r, int pos, int val) 27 { 28 if(l==r) 29 { 30 maxv[u] = val; 31 return; 32 } 33 34 int mid = (l+r)/2; 35 if(pos<=mid) add(u*2, l, mid, pos, val); 36 else add(u*2+1, mid+1, r, pos, val); 37 push_up(u); 38 } 39 40 int query(int u, int l, int r, int x, int y) 41 { 42 if(x<=l && r<=y) 43 return maxv[u]; 44 45 int ret = -INF; 46 int mid = (l+r)/2; 47 if(x<=mid) ret = max(ret, query(u*2, l, mid, x, y) ); 48 if(y>=mid+1) ret = max(ret, query(u*2+1, mid+1, r, x, y) ); 49 return ret; 50 } 51 52 int main() 53 { 54 int n, m; 55 while(scanf("%d%d", &n, &m)!=EOF) 56 { 57 memset(maxv, 0, sizeof(maxv)); 58 char op[2]; int a, b; 59 for(int i = 1; i<=n; i++) 60 { 61 scanf("%d", &a); 62 add(1, 1, n, i, a); 63 } 64 65 for(int i = 1; i<=m; i++) 66 { 67 scanf("%s%d%d", op, &a, &b); 68 if(op[0]==U) add(1, 1, n, a, b); 69 else printf("%d\n", query(1, 1, n, a, b)); 70 } 71 } 72 }
View Code

HDU1754 —— 線段樹 單點修改及區間最大值