hdu 1754 线段树(首)
来源:互联网 发布:自助发稿源码 编辑:程序博客网 时间:2024/05/23 13:33
首先没有用递归的写法,写了总是WA,找不到错误…………
然后又用递归的写了,终于AC。
AC代码:
#include <iostream>#include <cmath>#include <string>#include <cstring>#include <algorithm>#include <cstdio>using namespace std;#define MAXN 2000005int arr[MAXN];int n , m;int num_tree;struct tree{ int left , right , maxnn ;}ST[3*MAXN];void Build(int root , int left , int right){ ST[root].left = left; ST[root].right = right; if(left == right) { ST[root].maxnn = arr[left]; return ; } int mid = (left + right) / 2; int a , b ; Build(2 * root , left , mid); Build(2 * root + 1 , mid + 1 , right); ST[root].maxnn = max(ST[root*2].maxnn , ST[2*root + 1].maxnn);}void update(int root ,int pos , int val){ if(pos < ST[root].left || pos > ST[root].right) return ; ST[root].maxnn = max(ST[root].maxnn , val); int mid = (ST[root].right + ST[root].left) / 2; if(pos == ST[root].left && pos == ST[root].right) { ST[root].maxnn = val; return ; } if(pos <= mid) update(2*root , pos , val); else update(2 * root + 1 , pos ,val);}int Query(int l , int r , int pos){ if(ST[pos].left > r || ST[pos].right < l) { return 0 ; } int temp = (ST[pos].right + ST[pos].left) / 2; if(ST[pos].left == l && ST[pos].right == r) return ST[pos].maxnn; else if(r <= temp) return Query(l , r , 2 * pos); else if(l > temp) return Query(l , r , 2 * pos + 1); else if(l <= temp && r > temp) return max(Query(l , temp , 2 * pos) , Query(temp + 1, r , 2 * pos + 1));}int main(){ while(scanf("%d %d" , &n , &m) != EOF) { // memset(arr , -1 , sizeof(arr)); // for(int i = 1 ; i < MAXN ; i++) arr[i] = -999999; for(int i = 1 ; i <= n ; i++) { scanf("%d" , &arr[i]); } Build(1 , 1 , n); getchar(); char menu[10]; int a , b; for(int i = 0 ; i < m ; i ++ ) { scanf("%s" , menu); if(strcmp(menu , "Q") == 0) { scanf("%d %d" , &a ,&b); if(a > b) swap(a , b); printf("%d\n" , Query(a , b , 1)); } else if(strcmp(menu , "U") == 0) { scanf("%d %d" , &a ,&b); update(1 , a , b); } } } return 0;}
非递归代码:
#include <iostream>#include <cmath>#include <string>#include <cstring>#include <algorithm>#include <cstdio>using namespace std;#define MAXN 2000005int arr[MAXN];int n , m;int num_tree;struct tree{ int l , r , maxnn , root;}ST[3*MAXN];void Build(){ int pos = 1; for(int i = 1 ; ; i ++ ) { if(pos << i >= n) { pos <<= i ; break; } } num_tree = pos; for(int i = 0 ; i < pos ; i ++ ) { ST[i + pos].l = i + 1; ST[i + pos].r = i + 1; ST[i + pos].maxnn = arr[i]; ST[i + pos].root = (i + pos) / 2; } pos >>= 1; while(pos > 0) { for(int i = pos ; i < (pos << 1) ; i ++ ) { ST[i].l = ST[2*i].l; ST[i].r = ST[2*i + 1].r; ST[i].maxnn = max(ST[2*i].maxnn , ST[2*i+1].maxnn); ST[i].root = pos / 2; } pos >>= 1; }}void update(int pos , int val){ pos = pos + num_tree - 1; ST[pos].maxnn = val; pos = ST[pos].root; while(pos > 0) { if(val > ST[pos].maxnn) { ST[pos].maxnn = val; pos = ST[pos].root; } else break; }}int Query(int l , int r , int pos){ int temp = (ST[pos].r + ST[pos].l) / 2; if(ST[pos].l == l && ST[pos].r == r) return ST[pos].maxnn; else if(r <= temp) return Query(l , r , 2 * pos); else if(l > temp) return Query(l , r , 2 * pos + 1); else if(l <= temp && r > temp) return max(Query(l , temp , 2 * pos) , Query(temp + 1, r , 2 * pos + 1));}int main(){ while(scanf("%d %d" , &n , &m) != EOF) { // memset(arr , -1 , sizeof(arr)); for(int i = 0 ; i < MAXN ; i++) arr[i] = -999999; for(int i = 0 ; i < n ; i++) { scanf("%d" , &arr[i]); } Build(); getchar(); char menu[10]; int a , b; for(int i = 0 ; i < m ; i ++ ) { scanf("%s" , menu); if(strcmp(menu , "Q") == 0) { scanf("%d %d" , &a ,&b); if(a > b) swap(a , b); printf("%d\n" , Query(a , b , 1)); } else if(strcmp(menu , "U") == 0) { scanf("%d %d" , &a ,&b); update(a , b); } } } return 0;}
0 0
- hdu 1754 线段树(首)
- hdu 1754 (线段树)
- 线段树(hdu 1754)
- hdu 1754(线段树)
- HDU 1754 (线段树)
- hdu 1754 线段树
- hdu 1754 线段树
- hdu 1754 线段树
- 【线段树】hdu 1754
- hdu 1754 线段树
- hdu 1754 线段树
- hdu 1754 线段树
- hdu 1754 线段树
- HDU 1754 线段树
- HDU -1754线段树
- HDU 1754 线段树
- hdu 1754 线段树
- hdu 1754 线段树
- iOS Quartz2D - 画矩形
- Maximum Number Of Divisors
- 玩玩cmake
- SVN更新异常
- 机器学习-训练模型的保存与恢复(sklearn)
- hdu 1754 线段树(首)
- 判断两颗二叉树是否相同
- 华为 OJ 字符个数统计
- UVALive 6661
- 2015年多校联合训练第四场(Olympiad)hdu5327
- java concurrent并发详解
- TCP/IP概述
- hdu 5290 Bombing plan(树形dp)
- 剑指offer面试题36数组中的逆序对数