C82 树状数组 区修+区查 P3372 线段树1
视频链接:C82 树状数组 区修+区查 Luogu P3372 线段树 1_哔哩哔哩_bilibili

// 树状数组 区修+区查 O(nlogn) #include<bits/stdc++.h> #define int long long using namespace std; const int N=100005; int n,m; struct BIT{ int s[N]; void change(int x,int w){ for(;x<=n;x+=x&-x) s[x]+=w; } int query(int x){ int res=0; for(;x;x-=x&-x) res+=s[x]; return res; } }a,b; //a维护di的区间和, b维护di*(i-1)的区间和 signed main(){ ios::sync_with_stdio(0); cin>>n>>m; int op,x,y,k; for(int i=1;i<=n;i++){ //点修 cin>>k; a.change(i,k); a.change(i+1,-k); b.change(i,k*(i-1)); b.change(i+1,-k*i); } for(int i=1;i<=m;i++){ cin>>op>>x>>y; if(op==1){ //区修 cin>>k; a.change(x,k); a.change(y+1,-k); b.change(x,k*(x-1)); b.change(y+1,-k*y); } else{ //区查 cout<<(a.query(y)*y-b.query(y)) -(a.query(x-1)*(x-1)-b.query(x-1))<<"\n"; } } }
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号