【題解】CSES 1749 List Removals

【題目敘述】https://cses.fi/problemset/task/1749/

#include <iostream>
using namespace std;
 
int n, x[200005], p, bit[200005];
 
void update(int x, int d){
    while (x <= n){
        bit[x] += d;
        x += x & (-x);
    }
}
int query(int x){
    int ret = 0;
    for (int i = 17; i >= 0; i--){
        if (ret+(1<<i) <= n && bit[ret+(1<<i)] < x){
            ret += (1<<i);
            x -= bit[ret];
        }
    }
    return ret+1;
}
 
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++){
        cin >> x[i];
        update(i, 1);
    }
    for (int i = 1; i <= n; i++){
        cin >> p;
        int ret = query(p);
        cout << x[ret] << " ";
        update(ret, -1);
    }
    cout << "\n";
}
分享本文 Share with friends