一道线段树最基础的题 我的代码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是怎么获取区间最值的。不应该定义一个函数,递归向下,然后把得到的值传回来吗?