社区讨论

本题强制离线?

P1972[SDOI2009] HH 的项链参与者 7已保存回复 13

讨论操作

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

当前回复
13 条
当前快照
1 份
快照标识符
@mi8623vv
此快照首次捕获于
2025/11/21 09:13
4 个月前
此快照最后确认于
2025/11/21 09:48
4 个月前
查看原帖
RT,数组开小RE\text{RE},开大MLE\text{MLE},蒟蒻该怎么办?
评测记录链接分别如下:
注:代码中的pool数组是提前申请的内存。
代码如下(MLE):
CPP
#include <iostream>
#include <algorithm>

constexpr int maxv = 1000005, maxn = 500005;

struct Node {
    int val = 0;
    Node *lson = nullptr, *rson = nullptr;
} pool[maxn * 20 + 3], *addr[maxn];

int ptr = 0, n, m, prev[maxv];

Node* alloc() {
    return pool + ++ptr;
}

void update(Node *rt) {
    rt->val = 0;
    if (rt->lson) rt->val += rt->lson->val;
    if (rt->rson) rt->val += rt->rson->val;
}

#define MID (((l) + (r)) >> 1)

void modify(int l, int r, Node *rt, Node *prev, int v) {
    // std::cout << l << '-' << r << std::endl;
    if (l == r) {
        rt->val = prev->val + 1;
        // std::cout << "--- " << rt->val << std::endl;
        return;
    }
    if (v <= MID) {
        rt->rson = prev->rson;
        modify(l, MID, rt->lson = alloc(), prev->lson, v);
    } else {
        rt->lson = prev->lson;
        modify(MID + 1, r, rt->rson = alloc(), prev->rson, v);
    }
    update(rt);
}

int query(int l, int r, Node *rt, int p) {
    if (!rt) return 0;
    if (r <= p) return rt->val;
    int res = query(l, MID, rt->lson, p);
    if (p > MID) res += query(MID + 1, r, rt->rson, p);
    return res;
}

int main() {
    pool->lson = pool->rson = addr[0] = pool;
    std::cin >> n;
    for (int i = 1; i <= n; ++i) {
        int temp = 0;
        std::cin >> temp;
        modify(0, maxn, addr[i] = alloc(), addr[i - 1], prev[temp]);
        prev[temp] = i;
    }
    std::cin >> m;
    while (m--) {
        int x, y, a, b;
        std::cin >> x >> y, b = query(0, maxn, addr[x - 1], x - 1);
        a = query(0, maxn, addr[y], x - 1);
        // std::cout << a << '=' << b << std::endl;
        std::cout << a - b << std::endl;
    }
    return 0;
}

回复

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

正在加载回复...