Submission #1297122

#TimeUsernameProblemLanguageResultExecution timeMemory
1297122trung_tinRMQ (NOI17_rmq)C++17
23 / 100
20 ms456 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], mark[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 cur = sz(v); 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; } if (sz(v) == cur) { for (int i = 1; i <= n; i++) cout << -1 << " \n"[i == n]; return; } for (int j = l; j <= r; j++) b[j] = true; } for (int i = 1; i <= n; i++) res[i] = -1; 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; } vector<int> c; 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 && id < sz(c)) mark[id] = true, res[i] = c[id++]; } for (int i = 1; i <= n; i++) { if (f[res[i]] == true) { int val = res[i]; for (int j = 0; j < sz(c); j++) { if (mark[j]) continue; if (c[j] > res[i]) res[i] = c[j], mark[j] = true; } if (res[i] == val) { for (int i = 1; i <= n; i++) cout << -1 << " \n"[i == n]; return; } } f[res[i]] = true; } for (int i = 0; i < sz(c); i++) { if (mark[i] == false) { for (int i = 1; i <= n; i++) cout << -1 << " \n"[i == n]; return; } } for (int i = 0; i < sz(v); i++) { int l = v[i].l, r = v[i].r, x = v[i].x; int mi = (int)1e9; for (int j = l; j <= r; j++) mi = min(mi, res[j]); if (mi != x) { for (int i = 1; i <= n; i++) cout << -1 << " \n"[i == n]; return; } } 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(); if (sub1::check()) { sub1::solve(); return; } else if (sub2::check()) { sub2::solve(); return; } } 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...