求大佬教教优化常数,还是说指针过不了这题?(捞一下)
查看原帖
求大佬教教优化常数,还是说指针过不了这题?(捞一下)
339311
mori_楼主2023/7/19 19:12
//
// Created by Mori on 2023/7/19.
//

#include <bits/stdc++.h>

using namespace std;

typedef pair <int, int> pii;
typedef long long ll;
#define rep(i, x, y) for (int i = (x); i <= (y); ++i)
#define per(i, x, y) for (int i = (x); i >= (y); --i)

int read () {
    int res = 0;
    bool f = false;
    char temp = getchar();
    for (; !isdigit(temp); temp = getchar()) f = temp == '-';
    for (; isdigit(temp); temp = getchar()) res = res * 10 + temp - '0';
    if (f) return -res;
    return res;
}

char gc () {
    char temp = getchar();
    while (temp == '\n' || temp == '\r' || temp == ' ') temp = getchar();
    return temp;
}

constexpr int maxn = 1e6 + 105;

struct NODE {
    NODE *lk, *rk;
    int id, num;
} *root = new NODE;
NODE *version[maxn];
int val[maxn], l[maxn << 1], r[maxn << 1], cnt, cc = 1;

void build (NODE *u) {
    auto &ln = l[u->id], &rn = r[u->id];
    if (ln == rn) return u->num = val[ln], void();
    int mid = (ln + rn) >> 1;
    u->lk = new NODE, u->rk = new NODE;
    u->lk->id = ++cc, l[cc] = l[u->id], r[cc] = mid;
    u->rk->id = ++cc, l[cc] = mid + 1, r[cc] = r[u->id];
    build(u->lk), build(u->rk);
}

void modify (NODE *u, NODE *nu, int x, int y) {
    auto &ln = l[u->id], &rn = r[u->id];
    if (ln == rn && ln == x) return nu->num = y, void();
    int mid = (ln + rn) >> 1;
    if (x <= mid) {
        nu->rk = u->rk, nu->lk = new NODE;
        nu->lk->id = u->lk->id;
        modify(u->lk, nu->lk, x, y);
    } else {
        nu->lk = u->lk, nu->rk = new NODE;
        nu->rk->id = u->rk->id;
        modify(u->rk, nu->rk, x, y);
    }
}

int query (NODE *u, int x) {
    auto &ln = l[u->id], &rn = r[u->id];
    if (ln == rn && ln == x) return u->num;
    int mid = (ln + rn) >> 1;
    if (x <= mid) return query(u->lk, x);
    else return query(u->rk, x);
}

int n, m;

signed main () {
    n = read(), m = read();
    rep (i, 1, n) val[i] = read();
    version[0] = root;
    root->id = 1;
    l[1] = 1, r[1] = n;
    build(root);
    rep (i, 1, m) {
        int v = read(), op = read(), x = read();
        if (op == 1) {
            version[i] = new NODE{nullptr, nullptr, 1};
            modify(version[v], version[i], x, read());
        } else {
            version[i] = version[v];
            printf("%d\n", query(version[v], x));
        }
    }
    return 0;
}
2023/7/19 19:12
加载中...