社区讨论
唐唐小代码求条 qwq
P3203[HNOI2010] 弹飞绵羊参与者 4已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mdogeelg
- 此快照首次捕获于
- 2025/07/29 19:28 7 个月前
- 此快照最后确认于
- 2025/11/04 03:31 4 个月前
rt. 分块 TLE 60pts(所以这就是我为什么不喜欢用分块做题,比线段树难搞多了 qwq)
CPP#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5, B = 510;
int step[B][B], to[B][B];
int a[N];
int num;
int main() {
ios::sync_with_stdio(false);
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
num = (int)pow((double)n, 0.4);
int knum = (n % num == 0) ? num : num + 1;
int lastnum = (n % num == 0) ? num : n % num;
for (int i = n; i >= 1; i--) {
int pcn = (i - 1) / num, pos = (i - 1) % num + 1;
if (pos + a[i] > ((pcn == knum) ? lastnum : num)) {
to[pcn][pos] = i + a[i];
step[pcn][pos] = 1;
} else {
to[pcn][pos] = to[pcn][pos + a[i]];
step[pcn][pos] = step[pcn][pos + a[i]] + 1;
}
}
int m; cin >> m;
while (m--) {
int op;
cin >> op;
if (op == 1) {
// fprintf(stderr, "op = %d\n", op);
int x;
cin >> x;
x++;
// fprintf(stderr, "x = %d\n", x);
int pcn, pos;
int ans = 0;
while (x <= n) {
pcn = (x - 1) / num;
pos = (x - 1) % num + 1;
ans += step[pcn][pos];
x = to[pcn][pos];
}
cout << ans << '\n';
} else {
int x, k;
cin >> x >> k;
x++;
a[x] = k;
for (int i = (((x - 1) / num) + 1) * num; i > ((x - 1) / num) * num; i--) {
int pcn = (i - 1) / num, pos = (i - 1) % num + 1;
if (pos + a[i] > ((pcn == knum) ? lastnum : num)) {
to[pcn][pos] = i + a[i];
step[pcn][pos] = 1;
} else {
to[pcn][pos] = to[pcn][pos + a[i]];
step[pcn][pos] = step[pcn][pos + a[i]] + 1;
}
}
}
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...