Submission #1214451

#TimeUsernameProblemLanguageResultExecution timeMemory
1214451NeltHieroglyphs (IOI24_hieroglyphs)C++20
18 / 100
1105 ms1056820 KiB
#include "hieroglyphs.h" #include <bits/stdc++.h> #define ll long long #define endl "\n" using namespace std; struct SegTree { ll n; vector<pair<ll, ll>> st; SegTree(ll sz = 0) { n = sz; st.resize(n << 1, make_pair(0, -1)); } void build() { for (ll i = n - 1; i >= 1; i--) st[i] = max(st[i << 1], st[i << 1 | 1]); } void modify(ll p, pair<ll, ll> val) { for (st[p + n] = max(st[p + n], val), p += n; p > 1; p >>= 1) st[p >> 1] = max(st[p], st[p ^ 1]); } pair<ll, ll> query(ll l, ll r) { pair<ll, ll> ans = make_pair(0, -1); for (l += n, r += n + 1; l < r; l >>= 1, r >>= 1) { if (l & 1) ans = max(ans, st[l++]); if (r & 1) ans = max(ans, st[--r]); } return ans; } }; std::vector<int> ucs(std::vector<int> a, std::vector<int> b) { { set<ll> sa, sb; for (ll i : a) sa.insert(i); for (ll i : b) sb.insert(i); vector<int> nv; for (ll i : a) if (sb.count(i)) nv.push_back(i); a = nv; nv.clear(); for (ll i : b) if (sa.count(i)) nv.push_back(i); b = nv; } vector<int> ans; set<ll> s; map<ll, vector<ll>> freqb; map<ll, ll> cnt; for (ll i : a) cnt[i]++; for (ll i = 0; i < b.size(); i++) freqb[b[i]].push_back(i); vector<ll> event[a.size() + 1]; for (ll i = 0; i < a.size(); i++) if (cnt[a[i]] == 2) { if (s.count(a[i])) event[i].push_back(freqb[a[i]].back()); else event[i + 1].push_back(freqb[a[i]].back()), s.insert(a[i]); } s.clear(); for (ll i = 0; i < a.size(); i++) { for (ll j : event[i]) if (s.count(j)) s.erase(j); else s.insert(j); auto [l, r] = array<ll, 2>{freqb[a[i]].front(), freqb[a[i]].back()}; auto it = s.upper_bound(l); if (it != s.end() and *it < r) return {-1}; } vector<pair<ll, ll>> v; for (ll i = 0; i < a.size(); i++) for (ll j : freqb[a[i]]) v.push_back(make_pair(i, j)); SegTree st(v.size()); pair<ll, ll> dp[v.size()]; ll ptr = 0; for (ll i = 0; i < v.size(); i++) { auto [a, b] = v[i]; while (ptr < i and v[ptr].first < a) st.modify(v[ptr].second, make_pair(dp[ptr].first, ptr)), ptr++; dp[i] = st.query(0, b - 1); dp[i].first++; } if (v.empty()) return {}; ll best = max_element(dp, dp + v.size()) - dp; while (best + 1) ans.push_back(b[v[best].second]), best = dp[best].second; reverse(ans.begin(), ans.end()); if (ans.size() != cnt.size()) return {-1}; return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...