分块TLEon#21求调
  • 板块P2357 守墓人
  • 楼主nameko
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/3 20:13
  • 上次更新2024/8/3 21:31:19
查看原帖
分块TLEon#21求调
511411
nameko楼主2024/8/3 20:13
#include<bits/stdc++.h>
#define int long long
#define N 200020
#define M 500
using namespace std;
int n, f;
int pre[N], belong[N], tot, block, sum[M], L[M], R[M], tag[M], a[N];
void build(){
	block = sqrt(n);
	tot = n / block;
	if(n%block) tot ++;
	for(int i = 1; i <= n; i++) 
	    belong[i] = (i - 1) / block + 1,
	    pre[i] = pre[i - 1] + a[i];
	for(int i = 1; i <= tot; i++) 
	    L[i] = (i - 1)*block + 1,
		R[i] = i * block,
		sum[i] = pre[R[i]] - pre[R[i - 1]];
	R[tot] = n;
}
void Update2(int k){
	a[1] += k;
	sum[1] += k;
}
void Update1(int l, int r, int k){
	if(belong[l] == belong[r]){
		for (int i = l; i <= r; i++) a[i] += k;
		sum[belong[l]] += k*(r - l + 1);
		return;
	}
	for(int i = l; i <= R[belong[l]]; i++){
		a[i] += k;
	}
	sum[belong[l]] += k*(R[belong[l]] - l + 1);
	for(int i = L[belong[r]]; i <= r; i++){
		a[i] += k;
	}
	sum[belong[r]] += k*(r - L[belong[r]]+1);
	for(int i = belong[l] + 1; i < belong[r]; i++) tag[i] += k, sum[i] += k * block;
}
int query(int l, int r){
	int ans = 0;
	if(belong[l] == belong[r]){
		for (int i = l; i <= r; i++) ans += a[i];
		ans += tag[belong[l]] * (r - l + 1);
		return ans;
	}
	for(int i = l; i <= R[belong[l]]; i++){
		ans += a[i];
	}
	ans += tag[belong[l]]*(R[belong[l]] - l + 1);
	for(int i = L[belong[r]]; i <= r; i++){
		ans += a[i];
	}
		ans += tag[belong[r]]*(r - L[belong[r]]+1);
	for(int i = belong[l] + 1; i < belong[r]; i++) ans += sum[i];

} 
signed main(){
	scanf("%lld%lld", &n, &f);
	for(int i = 1; i <= n; i++) scanf("%lld", &a[i]);
	while(f--){
		int opt;
		scanf("%lld", &opt);
		if(opt == 1){
			int l, r, k;
			scanf("%lld%lld%lld", &l, &r, &k);
			Update1(l, r, k);
		}
		else if(opt == 2){
			int k;
			scanf("%lld", &k);
			Update2(k); 
		}
		else if(opt == 3){
			int k;
			scanf("%lld", &k);
			Update2(-k); 
		}
		else if(opt == 4){
			int l, r;
			scanf("%lld%lld", &l, &r);
			printf("%lld\n", query(l, r));
		}
		else printf("%lld\n", a[1] + tag[1]);
	} 
	return 0;
}
2024/8/3 20:13
加载中...