标签:des style blog color java 使用 strong io
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 37448 Accepted Submission(s): 14816
Sample Output
题解:很明显,这是一道线段树的单点更新求区间最值的一道题,单点更新倒是十分好办的,使用update函数更新到单点就可以了,关键是这个求区间最值的问题,假若最后查询的时候再计算这个最值,所花费的时间恐怕比直接暴力费时还要多,所以这题的正确解决方法是在update的时候顺便更新所有经过的节点的值。
AC代码如下:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 const int LEN = 200020; 7 8 struct line 9 { 10 int left; 11 int right; 12 int ma; 13 }line[LEN*5]; 14 15 void buildt(int l, int r, int step) //建树,同时初始化区间最值 16 { 17 line[step].left = l; 18 line[step].right = r; 19 line[step].ma = 0; 20 if (l == r) 21 return; 22 int mid = (l + r) / 2; 23 buildt(l, mid, step*2); 24 buildt(mid+1, r, step*2+1); 25 } 26 27 int update(int l, int r, int value, int step) //更新函数,返回整型 28 { 29 if (line[step].left == line[step].right){ //如果到达最深处的节点,则说明找到了需要更新的单点,赋值 30 line[step].ma = value; 31 return max(line[step/2*2].ma, line[step/2*2+1].ma); //返回该节点与其兄弟节点的较大值 32 } 33 int mid = (line[step].left + line[step].right) / 2; //向下继续搜索 34 if (r <= mid) 35 line[step].ma = update(l, r, value, step*2); 36 else if (l > mid) 37 line[step].ma = update(l, r, value, step*2+1); 38 else{ //如果目标线段处于目前线段的中点的两边,则同时搜索该节点的两个子节点,并取较大值 39 line[step].ma = max(update(l, mid, value, step*2), update(mid+1, r, value, step*2+1)); 40 } 41 return max(line[step/2*2].ma, line[step/2*2+1].ma); //返回该节点与其兄弟节点的较大值 42 } 43 44 int dfs(int l, int r, int step) //dfs找答案 45 { 46 if (l == line[step].left && r == line[step].right) //如果找到目标区间,返回值 47 return line[step].ma; 48 int mid = (line[step].left + line[step].right) / 2; 49 if (r <= mid) 50 return dfs(l, r, step*2); 51 else if (l > mid) 52 return dfs(l, r, step*2+1); 53 else{ 54 return max(dfs(l, mid, step*2), dfs(mid+1, r, step*2+1)); //返回该节点与其兄弟节点的较大值 55 } 56 } 57 58 59 int main() 60 { 61 int n, m; 62 //freopen("in.txt", "r", stdin); 63 while(scanf("%d %d", &n, &m) != EOF){ 64 buildt(1, n, 1); 65 for(int i = 1; i <= n; i++){ 66 int t; 67 scanf("%d", &t); 68 update(i, i, t, 1); 69 } 70 for(int i = 0; i < m; i++){ 71 char query[2]; 72 int a, b; 73 scanf("%s %d %d", query, &a, &b); 74 if (query[0] == ‘U‘) 75 update(a, a, b, 1); 76 else if (query[0] == ‘Q‘){ 77 printf("%d\n", dfs(a, b, 1)); 78 } 79 } 80 } 81 return 0; 82 }
【HDU】1754 I hate it ——线段树 单点更新 区间最值,布布扣,bubuko.com
【HDU】1754 I hate it ——线段树 单点更新 区间最值
标签:des style blog color java 使用 strong io
原文地址:http://www.cnblogs.com/kevince/p/3888281.html