请求加强数据
查看原帖
请求加强数据
648508
zjx_kimi楼主2024/7/24 16:40
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, m, L[N], R[N], bel[N], To[N], f[N], arr[N], cnt, len, op, a, b; // 块数,期望块长
void build() {
    cnt = sqrt(n), len = n / sqrt(n);
    for (int i = 1; i <= cnt; i++) L[i] = R[i - 1] + 1, R[i] = i * cnt; /*这些错了都能过 */R[cnt] = n;
    for (int i = 1; i <= n; i++) bel[i] = (i + len - 1) / len;
    for (int i = n; i >= 1; i--) 
        if (arr[i] + i > R[bel[i]]) 
            f[i] = 1, To[i] = i + arr[i];
        else 
            f[i] = f[i + arr[i]] + 1, To[i] = To[i + arr[i]];
}
void updata (int x, int y) {
    arr[x] = y;
    for (int i = R[bel[x]]; i >= L[bel[x]]; i--) 
        if (arr[i] + i > R[bel[i]]) 
            f[i] = 1, To[i] = i + arr[i];
        else 
            f[i] = f[i + arr[i]] + 1, To[i] = To[i + arr[i]];
}
int query (int x) {
    int ans = 0;
    while (x <= n) {
        ans += f[x];
        x = To[x];
    }
    return ans;
}
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> arr[i];
    build();
    cin >> m;
    while (m--) {
        cin >> op >> a, a++;
        if (op == 2) cin >> b;
        if (op == 1) cout << query(a) << '\n';
        if (op == 2) updata (a, b);
    }
}
2024/7/24 16:40
加载中...