线段树,样例都过不去求助
查看原帖
线段树,样例都过不去求助
235561
samzhangjy楼主2022/2/12 20:43

rt,代码如下

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 1e5 * 2 + 10;
const ll INF = (long long)1e62;

int m, D, len, t;
ll maxv[4 * N];

void pushup(int root) {
    maxv[root] = max(maxv[root * 2], maxv[root * 2 + 1]) % D;
}

void update(int root, int l, int r, int k, ll v) {
    if (l == r) {
        maxv[root] = v;
        return;
    }
    int mid = (l + r) / 2;
    if (mid >= k) {
        update(root * 2, l, mid, k, v);
    }
    if (mid < k) {
        update(root * 2 + 1, mid + 1, r, k, v);
    }
    pushup(root);
}

ll query(int root, int l, int r, int x, int y) {
    if (x <= l && r <= y) {
        return maxv[root];
    }
    int mid = (l + r) / 2;
    ll lson = -INF, rson = -INF;
    if (mid >= x) {
        lson = query(root * 2, l, mid, x, y);
    }
    if (mid < y) {
        rson = query(root * 2 + 1, mid + 1, r, x, y);
    }
    return max(lson, rson);
}

int main() {
    cin >> m >> D;
    for (int i = 1; i <= m; i++) {
        char op;
        int a;
        cin >> op >> a;
        if (op == 'Q') {
            int res = query(1, len - a + 1, len, 1, m);
            t = res % D;
            cout << res << endl;
        } else {
            update(1, 1, m, len + 1, (a + t) % D);
            len++;
        }
    }
    return 0;
}

蟹蟹各位dalao!

2022/2/12 20:43
加载中...