樹狀數組

http://blog.csdn.net/int64ago/article/details/7429868
板子

#include<iostream>
using namespace std;
int n,m;
int c[500001];
int lowbit(int i)
{  return i&(-i);
}
int add(int x,int i)
{  while (i<=n)
   {  c[i]+=x;
      i+=lowbit(i);
   }
}
int sum(int x)
{  int ans=0; 
   while (x>0)
   {  ans+=c[x];
      x-=lowbit(x);
   }
   return ans;
}
int main()
{  
   cin>>n>>m;
   for (int i=1;i<=n;++i)
   {  int x;cin>>x;
      add(x,i);
   }
   for (int i=1;i<=m;++i)
   {  int k,a,b;cin>>k>>a>>b;
      if (k==1)
        add(b,a);//單點修改 
      else
        cout<<sum(b)-sum(a-1)<<endl;//輸出區間和 
   }
}

還有一種就是區間修改單點查詢利用的是差分

#include<iostream>
using namespace std;
int n,m;
int c[500001];int d[500001];
int lowbit(int i)
{  return i&(-i);
}
int add(int x,int i)
{  while (i<=n)
   {  c[i]+=x;
      i+=lowbit(i);
   }
}
int sum(int x)
{  int ans=0; 
   while (x>0)
   {  ans+=c[x];
      x-=lowbit(x);
   }
   return ans;
}
int main()
{  
   cin>>n>>m;
   for (int i=1;i<=n;++i)
   {  cin>>d[i];
   }
   for (int i=1;i<=m;++i)
   {  int k,a,b,s;cin>>k;
      if (k==1)
      cin>>a>>b>>s;
      else
        cin>>b;
      if (k==1)
      {  add(s,a);
         if (b+1<=n)
         add(-s,b+1);//區間是修改 
      }
      else
        cout<<sum(b)+d[b]<<endl;//單點查詢 
   }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章