树状数组求助
查看原帖
树状数组求助
494192
ChickenDrinkingMilk楼主2022/5/15 22:13
#include<bits/stdc++.h>
#define lowbit(x) x&-x
#define ll unsigned long long
using namespace std;
const int N=500000;
ll n,q,a[N+5],c[N+5],c1[N+5],ans;
void add(ll x,ll s){
	ll k=x;
	while (x<=n){
		c[x]+=s;
		c1[x]+=s*k;
		x+=lowbit(x);
	}
}
int sum(ll x){
	ll res=0,res1=0,k=x;
	while (x){
		res+=c[x];
		res1+=c1[x];
		x-=lowbit(x);
	}
	return res*(k+1)-res1;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>q;
	for (int i=1;i<=n;i++){
		cin>>a[i];
		add(i,a[i]-a[i-1]);
	}
	while (q--){
		int op,l,r,k;
		cin>>op;
		switch(op){
			case 1:{
				cin>>l>>r>>k;
				add(l,k);
				add(r+1,-k);
				//for (int i=1;i<=n;i++) cout<<c[i]<<'.'<<c1[i]<<' ';cout<<'\n';
				break;
			}
			case 2:{
				cin>>k;
				add(1,k);
				add(2,-k);
				//for (int i=1;i<=n;i++) cout<<c[i]<<'.'<<c1[i]<<' ';cout<<'\n';				
				break;
			}
			case 3:{
				cin>>k;
				k=-k;
				add(1,k);
				add(2,-k);
				//for (int i=1;i<=n;i++) cout<<c[i]<<'.'<<c1[i]<<' ';cout<<'\n';				
				break;
			}
			case 4:{
				cin>>l>>r;
				//cout<<sum(r)<<'.'<<sum(l-1)<<'.';
				cout<<sum(r)-sum(l-1)<<'\n';
				break;
			}
			case 5:{
				//cin>>l>>r;
				cout<<sum(1)<<'\n';
				break;
			}
		}
	}
	return 0;
} 

WA28

2022/5/15 22:13
加载中...