Submission #1038101

#TimeUsernameProblemLanguageResultExecution timeMemory
1038101SoulKnightStone Arranging 2 (JOI23_ho_t1)C++17
100 / 100
115 ms23064 KiB
#include "bits/stdc++.h" using namespace std; #define ll long long #define ln '\n' const int N = 2e5 + 5; int n, a[N], glit = 1; vector<int> vec, where[N]; #define lc (v << 1) #define rc ((v << 1) + 1) struct node{ int color; int tm = -1; } seg[4*N]; void pushdown(int v){ if (!seg[v].color) return; seg[rc].color = (seg[rc].tm < seg[v].tm? seg[v].color: seg[rc].color); seg[rc].tm = max(seg[rc].tm, seg[v].tm); seg[lc].color = (seg[lc].tm < seg[v].tm? seg[v].color: seg[lc].color); seg[lc].tm = max(seg[lc].tm, seg[v].tm); seg[v].color = 0; seg[v].tm = -1; } void upd(int v, int tl, int tr, int l, int r, int color){ if (tr < l || tl > r) return; if (l <= tl && tr <= r){ // cout << v << ' ' << tl << ' ' << tr << ' ' << color << ln; seg[v].color = color; seg[v].tm = glit; return; } pushdown(v); int tm = (tl + tr) / 2; upd(lc, tl, tm, l, r, color); upd(rc, tm+1, tr, l, r, color); } int query(int v, int tl, int tr, int p){ if (tl == tr) return (seg[v].color == 0? a[tl]: seg[v].color); pushdown(v); int tm = (tl + tr) / 2; if (p <= tm) return query(lc, tl, tm, p); else return query(rc, tm+1, tr, p); } void solve(){ cin >> n; for (int i = 1; i <= n; i++){ cin >> a[i]; vec.push_back(a[i]); } sort(vec.begin(), vec.end()); vec.erase(unique(vec.begin(), vec.end()), vec.end()); for (int i = 1; i <= n; i++){ a[i] = lower_bound(vec.begin(), vec.end(), a[i]) - vec.begin()+1; } for (int i = 1; i <= n; i++){ // cout << "checking " << i << ' ' << a[i] << ln; while (!where[a[i]].empty()){ int last = where[a[i]].back(); int actual = query(1, 1, n, last); // cout << "looking " << last << ' ' << actual << ln; if (actual != a[i]) {where[a[i]].pop_back(); continue;} upd(1, 1, n, last, i-1, a[i]); break; } where[a[i]].push_back(i); glit++; } // for (int i = 1; i <= 4*n; i++) pushdown(i); for (int i = 1; i <= n; i++){ int t = query(1, 1, n, i); cout << vec[t-1] << ln; } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); // ll TT; cin >> TT; // while (TT--) {solve();} solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...