树状数组
1. POJ 3468 :树状数组的解法代码比线段树要短
#include<iostream> #include<cstdio> #include<algorithm> #include<queue> #include<utility> #include<vector> #include<cstring> #include<cmath> #define INF 0x3fffffff #define pb push_back #define pn(x) cerr<<x<<endl using namespace std; typedef long long ll; const int maxv=100005; typedef pair<int,ll> node; int N,Q; int a[maxv]; struct BIT{ ll bit[maxv*2]; void add(int i,int a){ while(i<maxv*2){ bit[i]+=a; i+=i&(-i); } } ll sum(int i){ ll ans=0; while(i>0){ ans+=bit[i]; i-=i&-i; } return ans; } }; //////查询所得的区间和为A[i]+B[i]*i BIT A,B; int main(){ freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); cin>>N>>Q; for(int i=1;i<=N;i++){ scanf("%d",&a[i]); A.add(i,a[i]); } while(Q--){ char q; cin>>q; if(q=='Q'){ int a,b; scanf("%d%d",&a,&b); printf("%I64d\n",A.sum(b)+b*B.sum(b)-(A.sum(a-1)+(a-1)*B.sum(a-1))); } else{ int a,b,c; scanf("%d%d%d",&a,&b,&c); B.add(a,c); B.add(b+1,-c); A.add(b+1,c*b); A.add(a,-c*(a-1)); } } return 0; }

浙公网安备 33010602011771号