diff --git a/Codeforces Round 977 (Div. 2, based on COMPFEST 16 - Final Round)/C2. Adjust The Presentation (Hard Version).cpp b/Codeforces Round 977 (Div. 2, based on COMPFEST 16 - Final Round)/C2. Adjust The Presentation (Hard Version).cpp index f1bc31e..ab6ae15 100644 --- a/Codeforces Round 977 (Div. 2, based on COMPFEST 16 - Final Round)/C2. Adjust The Presentation (Hard Version).cpp +++ b/Codeforces Round 977 (Div. 2, based on COMPFEST 16 - Final Round)/C2. Adjust The Presentation (Hard Version).cpp @@ -1,4 +1,4 @@ -/* Problem URL: https://codeforces.com/problemset/problem/2021/C2 */ +/* Problem URL: https://codeforces.com/contest/2021/problem/C2 */ #include #include @@ -91,104 +91,75 @@ void solve() int n, m, q; cin >> n >> m >> q; - vi a(n); - cin >> a; - vi var(n); - V> ap(n); + V> p(n); rep(i, n) { - var[a[i] - 1] = i; - ap[i].insert(oo); + int x; + cin >> x; + var[x - 1] = i; + p[i].insert(oo); } vi b(m); rep(i, m) { cin >> b[i]; - ap[var[b[i] - 1]].insert(i); + b[i]--; + p[var[b[i]]].insert(i); } - int sz = n; - while (__builtin_popcount(sz) != 1) { - sz++; + vi df(n - 1); + int c = 0; + rep(i, n - 1) { + df[i] = *p[i + 1].begin() - *p[i].begin(); + c += df[i] < 0; } - V>> seg(sz * 2); - vl sum(sz * 2); - nrep(i, sz, sz * 2) { - seg[i].insert({oo, i - sz}); - } + string ans[] = { + "TIDAK", + "YA" + }; - for (int i = sz - 1; i > 0; i--) { - repv(j, seg[i * 2]) { - seg[i].insert(j); + cout << ans[c == 0] << '\n'; + + auto rem = [&](int i) { + if (i < n - 1 && df[i] < 0) { + c--; } - repv(j, seg[i * 2 + 1]) { - seg[i].insert(j); - } - } - auto update = [&](int i, int v) { - int ind = i; - i += sz; - auto bf = *seg[i].begin(); - seg[i].clear(); - seg[i].insert({v, i - sz}); - int now = i & 1; - int dd = 0; - - for (i >>= 1; i > 0; i >>= 1) { - seg[i].erase(bf); - seg[i].insert({v, ind}); - sum[i] += dd; - - if (now) { - int s = seg[i * 2].size() - seg[i * 2].order_of_key({v, oo}); - int s2 = seg[i * 2].size() - seg[i * 2].order_of_key({bf.first, oo}); - sum[i] -= s2; - sum[i] += s; - dd -= s2; - dd += s; - } else { - int s = seg[i * 2 + 1].order_of_key({v, -1}); - int s2 = seg[i * 2 + 1].order_of_key({bf.first, -1}); - sum[i] -= s2; - sum[i] += s; - dd -= s2; - dd += s; - } - - now = i & 1; + if (i > 0 && df[i - 1] < 0) { + c--; } }; - rep(i, n) { - update(i, *ap[i].begin()); - } + auto add = [&](int i) { + if (i < n - 1) { + df[i] = *p[i + 1].begin() - *p[i].begin(); + c += df[i] < 0; + } - auto check = [&]() { - string ans[] = { - "TIDAK", - "YA" - }; - cout << ans[sum[1] == 0] << '\n'; + if (i > 0) { + df[i - 1] = *p[i].begin() - *p[i - 1].begin(); + c += df[i - 1] < 0; + } }; - check(); while (q--) { int i, j; cin >> i >> j; - i--; + i--, j--; int bf = b[i]; b[i] = j; - int actbf = var[bf - 1]; - int actb = var[b[i] - 1]; + j = var[j]; + bf = var[bf]; + rem(bf); + p[bf].erase(i); + add(bf); + rem(j); + p[j].insert(i); + add(j); - ap[actbf].erase(i); - ap[actb].insert(i); - update(actbf, *ap[actbf].begin()); - update(actb, *ap[actb].begin()); - check(); + cout << ans[c == 0] << '\n'; } } diff --git a/TODO.md b/TODO.md index 32f5727..c9d2f62 100644 --- a/TODO.md +++ b/TODO.md @@ -147,7 +147,7 @@ Official divs from codeforces I honestly have no idea how to solve this, the editorial didn't help much, I'll get back at it after learning NTT or something. - - [ ] [C2. Adjust The Presentation (Hard Version)](https://codeforces.com/problemset/problem/2021/C2) + - [X] [C2. Adjust The Presentation (Hard Version)](https://codeforces.com/problemset/problem/2021/C2) I already have the idea figured out, but my solution ended up getting TLE, I'll have to come with something better.