萌新求助,最后两个点WA80 QwQ
查看原帖
萌新求助,最后两个点WA80 QwQ
360214
nalemy楼主2021/8/1 16:35

rt,最后两个大数据点 WA 了。

#include<iostream>
#include<algorithm>
#define N 200000
using namespace std;

struct node {
    int sm, ls, rs;
} tr[N<<5];
int cnt, a[N], b[N], rt[N];
void build(int &u, int l, int r) {
    u = cnt++;
    if (l == r) return;
    int m = l + r >> 1;
    build(tr[u].ls, l, m), build(tr[u].rs, m+1, r);
}
int modify(int u, int l, int r, int k) {
    int v = cnt++, m = l + r >> 1; tr[v] = tr[u], tr[v].sm++;
    if (l == r) return v;
    if (k <= m) tr[v].ls = modify(tr[u].ls, l, m, k);
    else tr[v].rs = modify(tr[u].rs, m+1, r, k);
    return v;
}
int query(int u, int v, int l, int r, int k) {
    int m = l + r >> 1, t = tr[tr[v].ls].sm - tr[tr[u].ls].sm;
    if (l == r) return l;
    if (t >= k) return query(tr[u].ls, tr[v].ls, l, m, k);
    return query(tr[u].rs, tr[v].rs, m+1, r, k-t);
}
int main() {
    int n, m, q; cin >> n >> m;
    for (int i=0; i<n; i++)
        cin >> a[i], b[i] = a[i];
    sort(b, b+n), q = unique(b, b+n) - b, build(rt[0], 1, q);
    for (int i=0; i<n; i++) rt[i+1] = modify(rt[i], 1, q, lower_bound(b, b+q, a[i])-b+1);
    for (int l, r, k; m--;) cin >> l >> r >> k, cout << b[query(rt[l-1], rt[r], 1, q, k)-1] << '\n';
    return 0;
}
2021/8/1 16:35
加载中...