| ||||||||||
| 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 | |||||||||
我大体看了一下你的代码, 我觉得你应该好好想一下应该如何优美的实现线段树, 去找你们教主呗In Reply To:谁能帮我看看这个代码,线段树处理的这道题,怎么就超时呢?跪求大牛给个解释吧 Posted by:ZYWei at 2008-05-06 17:30:23 > ///////////////////////////////////////
> // 线段树解法 树中每结点的权值即所以其
> // 子树上所加的权
> ///////////////////////////////////////
>
> #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