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
原创粉丝点击