Submission #1297097

#TimeUsernameProblemLanguageResultExecution timeMemory
1297097trung_tinRMQ (NOI17_rmq)C++17
23 / 100
18 ms468 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> ii; #define fi first #define se second #define all(x) x.begin(), x.end() #define sz(x) (int)(x.size()) #define MASK(i) (1ll << i) const int N = 1e5 + 5; int n, q, res[N]; bool b[N], f[N]; struct Qe { int l, r, x; }qry[N]; namespace sub1 { bool check() { return (n <= 10); } void solve() { vector<int> v(n); for (int i = 0; i < n; i++) v[i] = i; do { bool check = true; for (int i = 1; i <= q; i++) { int l = qry[i].l, r = qry[i].r, x = qry[i].x; int mi = (int)1e9; for (int j = l - 1; j < r; j++) { mi = min(mi, v[j]); } if (mi != x) { check = false; break; } } if (check) { for (int i = 0; i < n; i++) cout << v[i] << " \n"[i == n - 1]; return; } } while (next_permutation(all(v))); for (int i = 1; i <= n; i++) cout << -1 << " \n"[i == n]; } } namespace sub2 { bool check() { return (n <= 1000 && q <= 1000); } bool b[N], f[N]; void solve() { sort(qry + 1, qry + q + 1, [](Qe a, Qe b) { return a.x > b.x; }); vector<Qe> v; for (int i = 1; i <= q; i++) { int l = qry[i].l, r = qry[i].r, x = qry[i].x; int k = l, h = l; while (k <= r) { while (b[k]) k++; h = max(h, k); while (h <= r && !b[h]) h++; v.push_back({k, h - 1, x}); k = h; } for (int j = l; j <= r; j++) b[j] = true; } for (int i = 1; i <= n; i++) res[i] = -1; vector<int> c; for (int i = 0; i < sz(v); i++) { int l = v[i].l, r = v[i].r, x = v[i].x; for (int j = l; j <= r; j++) res[j] = x; f[x] = true; } for (int i = 0; i < n; i++) { if (!f[i]) { c.push_back(i); } f[i] = false; } int id = 0; for (int i = 1; i <= n; i++) { if (res[i] == -1 || f[res[i]] == true) { res[i] = c[id++]; } if (res[i] != -1) f[res[i]] = true; } for (int i = 1; i <= n; i++) f[i] = 0; int cnt = 0; for (int i = 1; i <= n; i++) { if (res[i] != -1 && f[res[i]] == false) { cnt++; f[res[i]] = true; } } if (cnt != n) { for (int i = 1; i <= n; i++) res[i] = -1; } for (int i = 1; i <= n; i++) cout << res[i] << " \n"[i == n]; } } namespace sub3 { int lab[N], mx[N]; void make_set() { for (int i = 1; i <= n; i++) lab[i] = -1, mx[i] = i; } int find_(int u) { return lab[u] < 0 ? u : lab[u] = find_(lab[u]); } void unite(int a, int b) { a = find_(a), b = find_(b); if (a == b) return; if (lab[a] > lab[b]) swap(a, b); mx[a] = max(mx[a], mx[b]); lab[a] += lab[b]; lab[b] = a; } bool f[N]; void solve() { sort(qry + 1, qry + q + 1, [](Qe a, Qe b) { return a.x > b.x; }); vector<Qe> v; make_set(); for (int i = 1; i <= q; i++) { int l = qry[i].l, r = qry[i].r, x = qry[i].x; int k = l, h = l; while (k <= r) { int par = find_(k); if (mx[par] != k) k = mx[par] + 1; h = max(h, k); if (h > r) break; while (h <= r) { int par = find_(h); if (mx[par] == h) { if (h - 1 >= l) unite(h, h - 1); h++; } else break; } v.push_back({k, h - 1, x}); } } for (int i = 1; i <= n; i++) res[i] = -1; vector<int> c; for (int i = 0; i < sz(v); i++) { int l = v[i].l, r = v[i].r, x = v[i].x; for (int j = l; j <= r; j++) res[j] = x; f[x] = true; } for (int i = 0; i < n; i++) { if (!f[i]) { c.push_back(i); } f[i] = false; } int id = 0; for (int i = 1; i <= n; i++) { if (res[i] == -1 || f[res[i]] == true) { res[i] = c[id++]; } if (res[i] != -1) f[res[i]] = true; } for (int i = 1; i <= n; i++) f[i] = 0; int cnt = 0; for (int i = 1; i <= n; i++) { if (res[i] != -1 && f[res[i]] == false) { cnt++; f[res[i]] = true; } } if (cnt != n) { for (int i = 1; i <= n; i++) res[i] = -1; } for (int i = 1; i <= n; i++) cout << res[i] << " \n"[i == n]; } } void solve() { cin >> n >> q; for (int i = 1; i <= q; i++) { int l, r, val; cin >> l >> r >> val; l++, r++; qry[i] = {l, r, val}; } // sub1::solve(); // sub2::solve(); // sub3::solve(); return; if (sub1::check()) { sub1::solve(); return; } else if (sub2::check()) { sub2::solve(); return; } else { sub3::solve(); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); // #define TASK "chonqua" // freopen(TASK".inp", "r", stdin); // freopen(TASK".out", "w", stdout); int T = 1; // cin >> T; while (T--) { solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...