线段树求调
查看原帖
线段树求调
1334925
The_foolishest_OIer楼主2024/8/6 16:32
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e6 + 100;
int n,m,opt,x,y,k;
int a[maxn],sum[maxn],addv[maxn];
void build (int o,int l,int r){
	if (l == r) sum[o] = a[l];
	else{
		int mid = l + (r - l) / 2;
		build (o * 2,l,mid);
		build (o * 2 + 1,mid + 1,r);
		sum[o] = sum[o * 2] + sum[o * 2 + 1];
	}
}
void update (int o,int l,int r){
	if (l == r) {
		addv[o] += k;
		sum[o] += k;
	}else{
		int mid = l + (r - l) / 2;
		if (x <= mid) update (o * 2,l,mid);
		else update (o * 2 + 1,mid + 1,r);
		sum[o] = sum[o * 2] + sum[o * 2 + 1] + (r - l + 1) * k;
    }
}
int find (int o,int l,int r){
	if (x <= l && r <= y) return (sum[o] + (r - l + 1) * addv[o]);
	int ans = 0;
	int mid = l + (r - l) / 2;
	if (x <= mid) ans += (find (o * 2,l,mid) + (min(r,y) - max(l,x) + 1) * addv[o]);
	if (y > mid) ans += (find (o * 2 + 1,mid + 1,r) + (min(r,y) - max(l,x) + 1) * addv[o]);
	return ans;
}
int main(){
	cin >> n >> m;
	for (int i = 1 ; i <= n ; i++) cin >> a[i];
	build (1,1,n);
	for (int i = 1 ; i <= m ; i++){
		cin >> opt >> x >> y;
		if (opt == 1){
			cin >> k;
			update (1,1,n);
		}else{
			cout << find (1,1,n) << endl;
		}
	}
	return 0;
}

该程序样例输出:11 6 20

正确输出:11 8 20

P3372

2024/8/6 16:32
加载中...