Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:提交了很多次都是wa,初学线性树,求大神指点

Posted by haining at 2012-07-04 10:24:28
In Reply To:提交了很多次都是wa,初学线性树,求大神指点 Posted by:haining at 2012-07-04 10:24:04
> #include<iostream>
> #include<stdio.h>
> using namespace std;
> 
> int n,q;
> int ccount;
> long long sum,sum1,sum2;
> int num[1000000];
> struct cnode{
>        int l,r;
>        cnode *left,*right;
>        long long sum;
>        long long Inc;
>        }tree[3000000];
> 
> void buildtree(cnode *root,int l,int r)
> {    root->l=l;
>      root->r=r;
>      root->Inc=0;
>      if(l==r)
>      { 
>       root->sum=num[l];
>       return;   
>      }
>       ccount++;
>        root->left=tree+ccount;
>        buildtree(root->left,l,(l+r)/2);    
>        ccount++;
>        root->right=tree+ccount;
>        buildtree(root->right,(l+r)/2+1,r);
>      root->sum=root->left->sum+root->right->sum;
> } 
> void add(cnode *root,int a,int b,long long c)
> {
>      if(root->l==a&&root->r==b)
>       { root->Inc+=c;
>         return;
>        }
>       root->sum+=c*(b-a+1);
>       
>      if(b<=(root->l+root->r)/2)
>      add(root->left,a,b,c);
>      else if(a>(root->l+root->r)/2)
>       add(root->right,a,b,c);
>      else 
>      { add(root->left,a,(root->l+root->r)/2,c);
>        add(root->right,(root->l+root->r)/2+1,b,c);
>           }
>      } 
> long long query(cnode *root,int s,int v)
> { 
>    if(root->l==s&&root->r==v)
>    {
>       root->sum+=root->Inc*(v-s+1);
>     //  root->Inc=0;
>       return root->sum;
>                        
>     }  
>     
>     root->sum+=(root->r-root->l+1)*root->Inc;
>     add(root->left,root->l,(root->l+root->r)/2,root->Inc);
>     add(root->right,(root->l+root->r)/2+1,root->r,root->Inc);    
>     root->Inc=0; 
>     if(v<=(root->l+root->r)/2)
>      return query(root->left,s,v);
>     else if(s>(root->l+root->r)/2)
>      return query(root->right,s,v);
>     else
>     {  
>        sum1=query(root->left,s,(root->l+root->r)/2);
>         sum2=query(root->right,(root->l+root->r)/2+1,v);
>        return sum1+sum2;        
>     }
> }
> int main()
> {   int a,b,d,e,s,v;
>     char c[10];
>    while(scanf("%d%d",&n,&q)!=EOF){
>         ccount=0;
>         for(int i=1;i<=n;i++)
>          scanf("%d",&num[i]);
>            
>         buildtree(tree,1,n); 
>         for(int j=0;j<q;j++)
>         {
>          scanf("%s",c);
>          if(strcmp(c,"C")==0)
>          { 
>          scanf("%d%d%d",&b,&d,&e);
>          add(tree,b,d,e);
>                    }
>          else if(strcmp(c,"Q")==0)
>          {
>           scanf("%d%d",&s,&v);
>           printf("%I64d\n",query(tree,s,v));       
>                    }
>          }
>   
> }
>     //system("pause");
>     return 0;
> }
> 
> 
> 

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator