Submission #526627

#TimeUsernameProblemLanguageResultExecution timeMemory
526627MonarchuwuBubble Sort 2 (JOI18_bubblesort2)C++17
100 / 100
1513 ms45620 KiB
// http://s3-ap-northeast-1.amazonaws.com/data.cms.ioi-jp.org/open-2018/2018-open-bubblesort2-sol-en.pdf
#include<iostream>
#include<algorithm>
#include<vector>
#define all(x) x.begin(), x.end()
using namespace std;
typedef long long ll;

typedef pair<int, int> pii;
#define ff first
#define ss second

const int N = 5e5 + 5, SZ = 1 << 21, inf = 1e9 + 7;
int n, q, nq;

int seg[SZ], laz[SZ];
void upd(int u, int l, int r, int a, int b, int v) {
    if (a <= l && r <= b) {
        seg[u] += v;
        laz[u] += v;
        return;
    }
    int m = (l + r) >> 1, u1 = u << 1, u2 = u1 | 1;
    if (laz[u]) {
        seg[u1] += laz[u];
        seg[u2] += laz[u];
        laz[u1] += laz[u];
        laz[u2] += laz[u];
        laz[u] = 0;
    }
    if (a <= m) upd(u1, l, m, a, b, v);
    if (m < b) upd(u2, m + 1, r, a, b, v);
    seg[u] = max(seg[u1], seg[u2]);
}

void compress(vector<int> &a, const vector<int> &x, vector<int> &v) {
    vector<pii> b;
    for (int i = 0; i < n; ++i) b.emplace_back(a[i], i);
    for (int i = 0; i < q; ++i) b.emplace_back(v[i], x[i]);
    sort(all(b));
    b.resize(unique(all(b)) - b.begin());

    for (int i = 0; i < n; ++i) a[i] = lower_bound(all(b), pii(a[i], i)) - b.begin();
    for (int i = 0; i < q; ++i) v[i] = lower_bound(all(b), pii(v[i], x[i])) - b.begin();
}

vector<int> countScans(vector<int> a, vector<int> x, vector<int> v) {
    n = a.size(), q = x.size(), nq = n + q - 1;
    compress(a, x, v);

    upd(1, 0, nq, 0, nq, -inf);
    for (int i = 0; i < n; ++i) {
        upd(1, 0, nq, a[i], a[i], inf + i);
        upd(1, 0, nq, a[i] + 1, nq, -1);
    }

    vector<int> ans;
    for (int i = 0, j; i < q; ++i) {
        j = x[i];
        upd(1, 0, nq, a[j], a[j], -inf - j);
        upd(1, 0, nq, a[j] + 1, nq, 1);

        a[j] = v[i];
        upd(1, 0, nq, a[j], a[j], inf + j);
        upd(1, 0, nq, a[j] + 1, nq, -1);

        ans.push_back(seg[1]);
    }
    return ans;
}
/**  /\_/\
 *  (= ._.)
 *  / >0  \>1
**/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...