萌新刚学线段树一秒钟,求助蜜汁 TLE
查看原帖
萌新刚学线段树一秒钟,求助蜜汁 TLE
275273
zltqwq楼主2021/3/12 23:17

RT,下面是代码

#include <cstdio>
#include <cctype>
#include <cstring>
#define min(a, b) ((a) < (b) ? (a) : (b))

const int inf = 0x7f7f7f7f;
int n, q, a[100100], minv[400100];
char s[100];

int query(int o, int l, int r, int ql, int qr) {
    int m = (l + r) >> 1, ans = inf;
    if (ql <= l && r <= qr) {
        return minv[o];
    }
    if (ql <= m) {
        ans = min(ans, query(o << 1, l, m, ql, qr));
    }
    if (qr > m) {
        ans = min(ans, query(o << 1 | 1, m + 1, r, ql, qr));
    }
    return ans;
}

void update(int o, int l, int r, int p, int v) {
    int m = (l + r) >> 1;
    if (l == r) {
        minv[o] = v;
    } else {
        if (p <= m) {
            update(o << 1, l, m, p, v);
        } else {
            update(o << 1 | 1, m + 1, r, p, v);
        }
        minv[o] = min(minv[o << 1], minv[o << 1 | 1]);
    }
}

void build(int o, int l, int r) {
    if (l == r) {
        minv[o] = a[l];
        return;
    }
    int m = (l + r) >> 1;
    build(o << 1, l, m);
    build(o << 1 | 1, m + 1, r);
    minv[o] = min(minv[o << 1], minv[o << 1 | 1]);
}

int main() {
    scanf("%d%d", &n, &q);
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &a[i]);
    }
    build(1, 1, n);
    for (int _ = 0; _ < q; ++_) {
        scanf("%s", s);
        if (s[0] == 's') {
            int ss[50], vals[50], le = 0;
            for (int i = 6; s[i]; ++i) {
                if (isdigit(s[i])) {
                    int x = 0;
                    while (isdigit(s[i])) {
                        x = x * 10 + s[i++] - '0';
                    }
                    --i;
                    ss[le] = x;
                    vals[le++] = a[x];
                }
            }
            for (int i = 1; i < le; ++i) {
                update(1, 1, n, ss[i - 1], vals[i]);
                a[ss[i - 1]] = vals[i];
            }
            update(1, 1, n, ss[le - 1], vals[0]);
            a[ss[le - 1]] = vals[0];
        } else {
            int l, r;
            sscanf(s, "query(%d,%d)", &l, &r);
            printf("%d\n", query(1, 1, n, l, r));
        }
    }
    return 0;
}
2021/3/12 23:17
加载中...