社区讨论

求调

P13981数列分块入门 6参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mlhfkoq4
此快照首次捕获于
2026/02/11 10:48
4 周前
此快照最后确认于
2026/02/12 21:10
4 周前
查看原帖
求调,求调,求调
代码:
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 6e5;
int n, a[N + 5], len;
vector<int> v[N + 5];
auto atit(int p) {
    int np = 0;
    for (int i = 0; ; i ++)
        if (np + v[i].size() < p)
            np += v[i].size();
        else
            return v[i].begin() + (p - np - 1);
}
int atblock(int p) {
    int np = 0;
    for (int i = 0; ; i ++)
        if (np + v[i].size() < p)
            np += v[i].size();
        else
            return i;
}
void rebuild() {
    int curr = 0;
    for (int i = 0; !v[i].empty(); i ++)
        for (int vt : v[i])
            a[++ curr] = vt;
    for (int i = 0; !v[i].empty(); i ++)
        v[i].clear();
    n = curr;
    len = sqrt(curr);
    for (int i = 1; i <= n; i ++)
        v[i / len].emplace_back(a[i]);
}
signed main() {
    #ifndef ONLINE_JUDGE
        freopen("in.in", "r", stdin);
    #endif
    scanf("%lld", &n);
    len = sqrt(n);
    for (int i = 1; i <= n; i ++)
        scanf("%lld", a+i), v[i / len].emplace_back(a[i]);
    int optcnt = 0;
    for (int q = 1; q <= n; q ++) {
        int opt;
        scanf("%lld", &opt);
        if (opt == 0) {
            int p, x;
            scanf("%lld%lld", &p, &x);
            v[atblock(p)].emplace(atit(p), x);
            optcnt ++;
            if (optcnt >= 10 * len)
                optcnt = 0, rebuild();
        }
        else {
            int c;
            cin >> c;
            printf("%lld\n", *atit(c));
        }
    }
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...