60pts求助
查看原帖
60pts求助
561949
syr1125楼主2024/6/1 10:49

我又又又来求助了

#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 5, sN = 1e3 + 5;
int n, q, a[N], id[N], L[sN], R[sN], lazy[sN], vis[sN];

int main()
{
	scanf("%d %d", &n, &q);
	int sn = sqrt(n);
	for (int i = 1; i <= n; i ++)
	{
		scanf("%d", &a[i]);
		id[i] = i / sn + (bool)(i % sn);
	}
	for (int i = 1; i <= n + 1; i ++)
	{
		if (id[i] != id[i - 1]) L[id[i]] = i;
		if (id[i] != id[i + 1]) R[id[i]] = i;
	}
	
	while (q --)
	{
		char op;
		int l, r, w;
		cin >> op >> l >> r >> w;
		if (op == 'M')
		{
			int sid = id[l], eid = id[r];
			vis[sid] = 0, vis[eid] = 0;
			if (sid == eid)
			{
				for (int i = l; i <= r; i ++) a[i] += w;
			}
			for (int i = l; i <= R[sid]; i ++) a[i] += w;
			for (int i = sid + 1; i <= eid - 1; i ++) lazy[i] += w;
			for (int i = L[eid]; i <= r; i ++) a[i] += w;
		}
		else
		{
			int sid = id[l], eid = id[r], ans = 0;
			if (sid == eid)
			{
				for (int i = l; i <= r; i ++)
				{
					if (a[i] + lazy[sid] >= w) ans ++;	
				}
			}
			for (int i = l; i <= R[sid]; i ++)
			{
				if (a[i] + lazy[sid] >= w) ans ++;
			}
			for (int i = sid + 1; i <= eid - 1; i ++)
			{
				if (!vis[i]) sort(a + L[i], a + R[i] + 1);
				ans += (R[i] - L[i] + 1) - (lower_bound(a + L[i], a + R[i] + 1, w - lazy[i]) - (a + L[i]));
			}
			for (int i = L[eid]; i <= r; i ++)
			{
				if (a[i] + lazy[eid] >= w) ans ++;
			}
			cout << ans << "\n";
		}
	}
	return 0;
}

感觉分块假了,分块分成了暴力

2024/6/1 10:49
加载中...