求助!!!为什么分块会TLE!!!
  • 板块题目总版
  • 楼主Beta_Theta
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/12 20:45
  • 上次更新2024/7/12 21:03:27
查看原帖
求助!!!为什么分块会TLE!!!
965461
Beta_Theta楼主2024/7/12 20:45

P3203 HNOI2010 弹飞绵羊

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, m, len, t, op, p, w, k[200025], dp[200025], to[200025], pos[200025], s[1025], e[1025];
inline ll read() {
	ll neg = 1, x = 0;
	char c;
	while ((c = getchar()) < '0' || c > '9') if (c == '-') neg = -1;
	x = c - '0';
	while ((c = getchar()) >= '0' && c <= '9') x = x * 10 + (c - '0');
	return x * neg;
}
ll ask(int p) {
	ll res = 0;
	while (p <= n) {
		res += dp[p];
		p = to[p];
	}
	return res;
}
void change() {
	k[p] = w;
	for (int i = e[pos[p]]; i >= s[pos[p]]; i--) {
		if (i + k[i] >= e[pos[i]] + 1) {
			dp[i] = 1;
			to[i] = i + k[i];
		} else {
			dp[i] = dp[i + k[i]] + 1;
			to[i] = to[i + k[i]];
		}
	}
}
int main() {
	n = read();
	len = sqrt(n);
	t = (ll)ceil(1.0 * n / len);
	for (int i = 1; i <= n; i++) {
		k[i] = read();
		pos[i] = (ll)ceil(1.0 * i / len);
	}
	for (int i = 1; i <= t; i++) {
		s[i] = e[i - 1] + 1;
		e[i] = i*len;
	}
	for (int i = n; i >= 1; i--) {
		if (i + k[i] >= e[pos[i]] + 1) {
			dp[i] = 1;
			to[i] = i + k[i];
		} else {
			dp[i] = dp[i + k[i]] + 1;
			to[i] = to[i + k[i]];
		}
	}
	m = read();
	while (m--) {
		op = read(), p = read();
		p++;
		if (op == 1) {
			cout << ask(p) << "\n";
		} else {
			w = read();
			change();
		}
	}
	return 0;
}

除了第1和第3个测试点,其他全部TLE

2024/7/12 20:45
加载中...