社区讨论

唐唐小代码求条 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 条回复,欢迎继续交流。

正在加载回复...