读书人

一道线段树最基础的题 小弟我的代码w

发布时间: 2012-03-22 17:43:57 作者: rapoo

一道线段树最基础的题 我的代码wrong answer 求助、
http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1189

线段树最基本的应用 区间最大值、下面是我的代码:

C/C++ code
#include <stdio.h>#define maxnum 100003#include <iostream>using namespace std;int num[maxnum+5],re;int max(int a,int b){return a>b?a:b;}struct code{    int l,r,max;}xd[4*maxnum+5];void creat(int u,int l,int r){    xd[u].l=l; xd[u].r=r;    if(l==r) xd[u].max=num[l];    else    {        int mid=(l+r)/2;        creat(u+u,l,mid);        creat(u+u+1,mid+1,r);        xd[u].max=max(xd[u+u].max,xd[u+u+1].max);    }}void work(int u,int l,int r){    int mid=(xd[u].l+xd[u].r)/2;    if(xd[u].l==l&&xd[u].r==r)    {        re=max(re,xd[u].max);    }    else if(l>=mid+1)    {        work(u+u+1,l,r);    }    else if(r<=mid)    {        work(u+u,l,r);    }    else    {        work(u+u,l,mid);        work(u+u+1,mid+1,r);    }}int main(){    int n,q,js=1,a,b;    while(scanf("%d",&n)!=EOF)    {        printf("Case %d:\n",js);        js++;        for(int i=1;i<=n;i++)             scanf("%d",&num[i]);        creat(1,1,n);        for(int i=1;i<=4*n;i++)            cout<<xd[i].max<<" ";        cout<<endl;        scanf("%d",&q);        while(q--)        {            scanf("%d%d",&a,&b);            re=-9999;            work(1,a,b);            printf("%d\n",re);        }    }}


[解决办法]
难道不用先输入后输出??你的还没输入就输出了,这不算错?
[解决办法]
work()函数写的太奇葩了,那么多else干嘛?直接两组相互独立的if就好了,不知LZ是参照的哪份代码?

还有,我没看懂LZ是怎么获取区间最值的。不应该定义一个函数,递归向下,然后把得到的值传回来吗?

读书人网 >软件架构设计

热点推荐