#4 求调,弹飞绵羊已过,附加一个问题
  • 板块CF13E Holes
  • 楼主zjx_kimi
  • 当前回复12
  • 已保存回复12
  • 发布时间2024/7/24 16:20
  • 上次更新2024/7/24 17:06:14
查看原帖
#4 求调,弹飞绵羊已过,附加一个问题
648508
zjx_kimi楼主2024/7/24 16:20

code:

#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], Last[N], cnt, len, op, a, b; // 块数,期望块长
void build() {
    cnt = sqrt(n), len = n / sqrt(n);
  
  // 如果写成 len = n / cnt 会 WA #1, 不知道为什么。
    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], Last[i] = i;
        else 
            f[i] = f[i + arr[i]] + 1, To[i] = To[i + arr[i]], Last[i] = Last[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], Last[i] = i;
        else 
            f[i] = f[i + arr[i]] + 1, To[i] = To[i + arr[i]], Last[i] = Last[i + arr[i]];;
}
void query (int x) {
    int ans = 0;
    while (x <= n) {
        ans += f[x];
        if (To[x] > n) cout << Last[x] << ' ';
        x = To[x];
    }
    cout << ans << '\n';
}
int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> arr[i];
    build();
    while (m--) {
        cin >> op >> a;
        if (op == 0) cin >> b;
        if (op == 1) query(a);
        if (op == 0) updata (a, b);
    }
}
2024/7/24 16:20
加载中...