[LOJ6282] 数列分块入门 6

给定一个长为 (n) 的序列,有 (n) 次操作,每次可能在指定位置插入一个数,或者询问指定位置的数是多少,数据随机

Solution

考虑到数据随机,我们维护 (sqrt n)vector,每次操作的时候暴力扫一遍找到对应下标的位置即可

事实证明这样 T 了,我们该用 list,于是就过了

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 200005;

int n, a[N], b[N], len, siz[N];
list<int> v[N];

#define li list<int>::iterator

li operator+(li a, int b) {
    while (b--) a++;
    return a;
}

signed main() {
    ios::sync_with_stdio(false);
    cin >> n;
    len = ceil(sqrt(n));
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i <= n; i++) b[i] = (i - 1) / len + 1;
    for (int i = 1; i <= n; i++) v[b[i]].push_back(a[i]), siz[b[i]]++;
    for (int _ = 1; _ <= n; _++) {
        int opt, l, r, c;
        cin >> opt >> l >> r >> c;
        if (opt == 0) {
            --l;
            int p = 1;
            while (l >= siz[p] && p <= n / len + 1) {
                l -= siz[p++];
            }
            v[p].insert(v[p].begin() + l, r);
            siz[p]++;
        } else {
            --r;
            int p = 1;
            while (r >= siz[p] && p <= n / len + 1) {
                r -= siz[p++];
            }
            cout << *(v[p].begin() + r) << endl;
        }
    }
}
原文地址:https://www.cnblogs.com/mollnn/p/12703455.html