Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
谁能帮我看看这个代码,线段树处理的这道题,怎么就超时呢?跪求大牛给个解释吧/////////////////////////////////////// // 线段树解法 树中每结点的权值即所以其 // 子树上所加的权 /////////////////////////////////////// #include<stdio.h> #include<math.h> /////////////////////////////////////// // line is a struct of the tree node /////////////////////////////////////// struct line { int left; int right; int power; }; double lg2(double n) { return log(n)/log((double)2); } /////////////////////////////////////// // judge a line from left to right and // add the power to the proper position /////////////////////////////////////// void insert(int left,int right,int currentNodeIndex,int power,line* num) { if(left==num[currentNodeIndex].left&& right==num[currentNodeIndex].right) { num[currentNodeIndex].power=power+num[currentNodeIndex].power; //printf("num[%d].power=%d \n",currentNodeIndex,num[currentNodeIndex].power); return ; } if(num[currentNodeIndex].left==num[currentNodeIndex].right) return ; int mid=(num[currentNodeIndex].left+num[currentNodeIndex].right)/2; if(mid<left) { /*if(currentNodeIndex==0) currentNodeIndex=1;*/ insert(left,right,(currentNodeIndex+1)*2,power,num); } else if(mid>=right) { insert(left,right,currentNodeIndex*2+1,power,num); } else { insert(left,mid,currentNodeIndex*2+1,power,num); /*if(currentNodeIndex==0) currentNodeIndex=1;*/ insert(mid+1,right,(currentNodeIndex+1)*2,power,num); } } ////////////////////////////////////// // construct a line-tree from start to // end ////////////////////////////////////// int construct(int start,int end,line* num,int n) { num[0].left=start; num[0].right=n-1; if(start==n-1) { scanf("%d",&num[0].power); return 0; } else num[0].power=0; int i=1; while(i!=2*n-1-(n-(end-start+1))) { if(i%2==1) { num[i].left=num[i/2].left; num[i].right=(num[i/2].left+num[i/2].right)/2; } else { num[i].left=num[i-1].right+1; num[i].right=num[i/2-1].right; } if(num[i].left==num[i].right) scanf("%d",&num[i].power); else num[i].power=0; i++; } //i=0;i<2*n-1;i++n-1 /*for(i=0;i<2*n-1-(n-(end-start+1));i++) printf("%d ",num[i].power); printf("\n");*/ return n-1; } /////////////////////////////////////// // output the sum from left to right /////////////////////////////////////// __int64 outResult(int left,int right,line* num) { __int64 sum=0; for(int i=left;i<=right;i++) { int j=i; while(j!=0) { sum+=num[j].power; j=(j-1)/2; } sum+=num[j].power; } return sum; } int main() { int N,Q; scanf("%d%d",&N,&Q); line *num; ////////////////////// int n=N; double m=lg2((double)n); if(m!=(int)m) m=(int)m+1; n=pow(2,m); num=new line[2*n-1]; /////////////////////// int base=construct(0,N-1,num,n)-1; char letter; int a,b,c; while(Q!=0) { __int64 sum=0; getchar(); scanf("%c%d%d",&letter,&a,&b); if(letter=='C') { getchar(); scanf("%d",&c); insert(a-1,b-1,0,c,num); } else { a=a+base; b=b+base; sum=outResult(a,b,num); printf("%I64d\n",sum); } Q--; } delete []num; return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator