教主的魔法 初学分块求调QAQ
查看原帖
教主的魔法 初学分块求调QAQ
1420058
HaloisAWA楼主2024/11/13 21:39
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
int n,m,block,num,st[1000010],ed[1000010],pos[1000010];
ull tag[1000010],a[1000010],b[1000010];
void build() {
	block = sqrt(n);
	num = n / block;
	if (n % block) ++ num;
	for (int i = 1;i <= num;i ++) {
		st[i] = (i - 1) * block + 1;
		ed[i] = i * block;
	}
	ed[num] = n;
	for (int i = 1;i <= n;i ++)
		pos[i] = (i - 1) / block + 1;
	for (int i = 1;i <= num;i ++)
		sort(b + st[i],b + ed[i] + 1);
	return;
}
void update(int l,int r,ull d) {
	if (pos[l] == pos[r]) {
		for (int i = st[pos[l]];i <= ed[pos[l]];i ++) {
			if (i >= l && i <= r) a[i] += d;
			b[i] = a[i];
		}
		sort(b + st[pos[l]],b + ed[pos[l]] + 1);
	} else {
		for (int i = pos[l] + 1;i <= pos[r] - 1;i ++)
			tag[i] += d;
		for (int i = l;i <= ed[pos[l]];i ++) {
			a[i] += d;
			b[i] = a[i];
		}
		sort(b + l,b + ed[pos[l]] + 1);
		for (int i = st[pos[r]];i <= r;i ++) {
			a[i] += d;
			b[i] = a[i];
		}
		sort(b + st[pos[r]],b + r + 1);
	}
	return;
}
int query(int l,int r,ull k) {
	int res = 0;
	if (pos[l] == pos[r]) {
		res = (b + r + 1 - lower_bound(b + l,b + r + 1,k - tag[pos[l]]));
	} else {
		for (int i = pos[l] + 1;i <= pos[r] - 1;i ++)
			res += (b + ed[i] + 1 - lower_bound(b + st[i],b + ed[i] + 1,k - tag[i]));
		res += (b + ed[pos[l]] + 1 - lower_bound(b + l,b + ed[pos[l]] + 1,k - tag[pos[l]]));
		res += (b + r + 1 - lower_bound(b + st[pos[r]],b + r + 1,k - tag[pos[r]]));
	}
	return res;
}
int main() {
	scanf("%d%d",&n,&m);
	for (int i = 1;i <= n;i ++) {
		scanf("%lld",&a[i]);
		b[i] = a[i];
	}
	build();
	for (int i = 1;i <= m;i ++) {
		char ch;
		int l,r;
		ull k;
		cin >> ch >> l >> r >> k;
		if (ch == 'M') {
			update(l,r,k);
		} else {
			printf("%d\n",query(l,r,k));
		}
	}
	return 0;
}

2024/11/13 21:39
加载中...