分块,全WA
查看原帖
分块,全WA
816792
coritom楼主2024/3/14 18:49
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 1e6 + 5; 
int n, m, l[maxn], r[maxn], sum[maxn];
int ans[maxn], a[maxn], pre[maxn], cnt;
void init(){
	int block = sqrt(n);
	int t = n / block;
	if(n % block) t++;
	for(int i = 1; i <= t; i++){
		l[i] = (i - 1) * block + 1;
		r[i] = i * block;
	}
	r[t] = n;
	for(int i = 1; i <= t; i++){
		for(int j = l[i]; j <= r[i]; j++){
			sum[i] += a[j];
		}
	}
	for(int i = 1; i <= n; i++){
		pre[i] = (i - 1) / block + 1;
	}
}
void add(int lt, int rt, int k){
	int p = pre[lt], q = pre[rt];
	if(p == q){
		for(int i = lt; i <= rt; i++) a[i] += k;
		sum[p] += (rt - lt + 1) * k;
	}
	else{
		for(int i = p + 1; i < q; i++) ans[i] += k;
		for(int i = lt; i <= r[p]; i++) a[i] += k;
		sum[p] += (r[p] - lt + 1) * k;
		for(int i = l[q]; i <= rt; i++) a[i] += k;
		sum[q] += (rt - l[q] + 1) * k;
	}
}
int query(int lt, int rt){
	int p = pre[lt], q = pre[rt];
	cnt = 0;
	if(p == q){
		for(int i = lt; i <= rt; i++) cnt += a[i];
		cnt += ans[p] * (rt - lt + 1);
	}
	else{
		for(int i = p + 1; i < q; i++) cnt += sum[i] + ans[i] * (r[i] - l[i] + 1);
		for(int i = lt; i <= r[p]; i++) cnt += a[i];
		cnt += ans[p] * (r[p] - lt + 1) * ans[p];
		for(int i = l[q]; i <= rt; i++) cnt += a[i];
		cnt += (rt - l[q] + 1) * ans[q];
	}
	return cnt;
}
signed main(){
	cin >> n >> m;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
	}
	init();
	int op, x, y, k;
	while(m--){
		cin >> op >> x >> y;
		if(op == 1){
			cin >> k;
			add(x, y, k);
		}
		else{
			cout << query(x, y) << "\n";
		}
	}
	return 0;
}

2024/3/14 18:49
加载中...