分块TLE50求助
查看原帖
分块TLE50求助
253527
GuideZombies楼主2022/2/9 19:30
#include <bits/stdc++.h>
using namespace std;
int n, m, k[200010][2], g[200010], len, cnt;
long long a[200010], sum[200010];
bool t[200010];
int main() {
//	freopen("P4145_6.in", "r", stdin);
	cin >> n; len = sqrt(n);
	for (int i = 1; i <= n; ++ i) cin >> a[i];
	for (int i = 1, j = len; j <= n; i = j + 1, j += len) {
		++ cnt;
		k[cnt][0] = i; k[cnt][1] = j;
	}
	for (int i = 1; i <= n; ++ i) {
		g[i] = i % len == 0 ? i / len : i / len + 1;
		sum[g[i]] += a[i];
	}
	cin >> m;
	for (int i = 1; i <= m; ++ i) {
		int opt, l, r; cin >> opt >> l >> r;
		if (l > r) swap(l, r);
		if (opt == 0) {
			for (int j = l; j <= r; ++ j) {
				if (t[g[j]]) j = k[g[j]][1];
				else {
					sum[g[j]] += sqrt(a[j]) - a[j];
					a[j] = sqrt(a[j]);
				}
			}
			for (int j = g[l]; j <= g[r]; ++ j)
				if (sum[j] == len) t[j] = 1;
		}
		else {
			long long ans = 0;
			for (int j = l; j <= r; ++ j) {
				if (k[g[j]][0] >= l && k[g[j]][1] <= r) {
					ans += sum[g[j]];
					j = k[g[j]][1];
				}
				else ans += a[j];
			}
			cout << ans << endl;
		}
	}
	return 0;
}
2022/2/9 19:30
加载中...