Submission #1356144

#TimeUsernameProblemLanguageResultExecution timeMemory
1356144gayStone Arranging 2 (JOI23_ho_t1)C++20
100 / 100
174 ms36816 KiB
#include <bits/stdc++.h>
#include <experimental/random>
#include <random>

//#include <ext/pb_ds/assoc_container.hpp>
//using namespace __gnu_pbds;

using namespace std;

using ld = long double;
using ll = long long;

const ll INF = 1e18, MOD = 1e9 + 7;

void solve();

signed main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    int q = 1;
    //cin >> q;
    while (q--) {
        solve();
    }
}

vector<ll> p;
vector<ll> lf;
vector<ll> color;

ll get(ll x) {
    if (p[x] == x) {
        return p[x];
    }
    p[x] = get(p[x]);
    return p[x];
}

void join(ll x, ll y, ll c) {
    x = get(x);
    y = get(y);
    p[y] = x;
    lf[x] = min(lf[x], lf[y]);
    color[x] = c;
}

void solve() {
    ll n;
    cin >> n;
    p.resize(n);
    lf.resize(n);
    color.resize(n);
    iota(p.begin(), p.end(), 0);
    iota(lf.begin(), lf.end(), 0);

    vector<ll> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        color[i] = a[i];
    }

    map<ll, set<ll>> id;
    id[a[0]].insert(0);
    for (int i = 1; i < n; i++) {
        if (empty(id[a[i]])) {
            id[a[i]].insert(i);
            continue;
        }
        ll j = get(*id[a[i]].rbegin());


        ll cur = i;
        while (cur != j) {
            ll lx = lf[cur];
            id[color[get(lx - 1)]].erase(get(lx - 1));
            join(lx - 1, cur, a[i]);
            cur = get(lx - 1);
        }

        id[a[i]].insert(get(cur));
    }

    for (int i = 0; i < n; i++) {
        cout << color[get(i)] << '\n';
    }
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...