hdu1754

线段树的问题,不知道为什么我的代码老是runtime error ,哪位大牛能告诉我啊

#include <stdio.h>

int max(int d,int b)//这里如果用inline会加速好多啊
{
    return d>b?d:b;
}


#define  MAXN  2000000
int a[MAXN+5];


struct node
{
    int left;
    int right;
    int sum;
} b[MAXN*2];


void build(int left , int right , int i)//为left,right ,sum赋值
{
    int mid;
    b[i].left=left;
    b[i].right=right;
    if(left==right)
    {
        b[i].sum=a[left];
        return ;
    }

    mid=(left+right)/2;
    build(left,mid,2*i);
    build(mid+1,right,2*i+1);
    b[i].sum=max(b[2*i].sum , b[2*i+1].sum);

}

void  Update(int id,int value,int i)
{
    if(b[i].left==b[i].right)
    {
        b[i].sum=value;
        return ;
    }


        int mid =(b[i].left+b[i].right)/2;
        if(mid>=id) Update(id,value,2*i);
        if(id>mid) Update(id ,value,2*i+1);
        b[i].sum=max(b[i*2].sum , b[2*i+1].sum);//注意更新的时候不仅更新子节点,还要更新父节点

}


int Query(int left, int right,int i)
{
    int mid;
    if(b[i].left==left && b[i].right ==right) return b[i].sum;
    mid=(b[i].left+b[i].right)/2;
    if(right<=mid) return Query(left,right,2*i);
    if (left>mid ) return Query(left,right,2*i+1);
    if(left<=mid && mid<right)
    return max(Query(left,mid,2*i) , Query(mid+1,right,2*i+1));
}


int main()
{
    int n,m;
    char c;
    int id,value;
    int i;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        //scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        build(1,n,1);
        for(i=0;i<m;i++)
        {
            scanf("%c",&c);
            scanf("%d%d",&id,&value);
            if(c=='U') Update(id,value,1);
            if(c=='Q') printf("%d\n",Query(id,value,1));
        }
    }
    return 0;
}
终于知道哪错了,有两个地方,第一b[]数组开小了,至少要三倍或者四倍a[]数组,第二输入char c时有误,要用char c[3],要输入一个字符串,因为单独输入一个字符的话会把回车给独到
char c 中,在最下面贴最新的代码

另外附一个能A的

  1 #include <iostream>
  2 #include <cstdio>
  3 using namespace std;
  4  
  5 const int MAXN=2000000;
  6  
  7 int n,m,a[MAXN+5];
  8  
  9 struct tree
 10 {
 11     int l,r;
 12  
 13     int v;
 14  
 15 }trees[MAXN*2];
 16  
 17 int max(int k,int l)
 18 {
 19     return k>l?k:l;
 20 }
 21  
 22 void buildtree(int rs,int l,int r)
 23 {
 24     //printf("%d %d %d\n",rs,l,r);
 25     trees[rs].l=l;
 26     trees[rs].r=r;
 27     if(r==l)
 28     {
 29         trees[rs].v=a[l];
 30         return ;
 31     }
 32  
 33     int mid=(l+r)/2;
 34  
 35     buildtree(rs*2,l,mid);
 36     buildtree(rs*2+1,mid+1,r);
 37  
 38     trees[rs].v=max(trees[rs*2].v,trees[rs*2+1].v);
 39 }
 40  
 41 void update(int rs,int k,int l)
 42 {
 43     //printf("%d %d %d %d %d\n",rs,k,l,trees[rs].l,trees[rs].r);
 44  
 45     if(trees[rs].l==k&&trees[rs].r==k)
 46     {
 47         trees[rs].v=l;
 48         return ;
 49     }
 50  
 51     int mid=(trees[rs].l+trees[rs].r)/2;
 52  
 53     if(k<=mid)update(rs*2,k,l);
 54     if(k>mid)update(rs*2+1,k,l);
 55      
 56     trees[rs].v=max(trees[rs*2].v,trees[rs*2+1].v);
 57 }
 58  
 59 int querry(int rs,int l,int r)
 60 {
 61     //printf("%d %d %d\n",rs,l,r);
 62     if(trees[rs].l==l&&trees[rs].r==r)
 63         return trees[rs].v;
 64  
 65     int mid=(trees[rs].l+trees[rs].r)/2;
 66  
 67     if(r<=mid)return querry(rs*2,l,r);
 68     if(l>mid)return querry(rs*2+1,l,r);
 69     if(l<=mid&&r>mid)
 70         return max(querry(rs*2,l,mid),querry(rs*2+1,mid+1,r));
 71  
 72     return 0;
 73 }
 74  
 75 int main()
 76 {
 77     int i,ac,bc;
 78  
 79     char c;
 80  
 81     while(scanf("%d%d",&n,&m)!=EOF)
 82     {
 83         for(i=1;i<=n;i++)
 84             scanf("%d",&a[i]);
 85  
 86         buildtree(1,1,n);
 87  
 88         for(i=1;i<=m;i++)
 89         {
 90             getchar();
 91  
 92             scanf("%c%d%d",&c,&ac,&bc);
 93  
 94             if(c=='Q')
 95                 printf("%d\n",querry(1,ac,bc));
 96             else
 97                 update(1,ac,bc);
 98         }
 99     }
100  
101     return 0;
102 }

posted on 2012-08-02 09:15  矮人狙击手!  阅读(1302)  评论(0编辑  收藏  举报

导航