Finish one problem

This commit is contained in:
2026-04-14 20:52:04 -03:00
parent ac1107bd79
commit 16b9334310
2 changed files with 44 additions and 73 deletions

View File

@@ -1,4 +1,4 @@
/* Problem URL: https://codeforces.com/problemset/problem/2021/C2 */ /* Problem URL: https://codeforces.com/contest/2021/problem/C2 */
#include <bits/stdc++.h> #include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/assoc_container.hpp>
@@ -91,104 +91,75 @@ void solve()
int n, m, q; int n, m, q;
cin >> n >> m >> q; cin >> n >> m >> q;
vi a(n);
cin >> a;
vi var(n); vi var(n);
V<set<int>> ap(n); V<set<int>> p(n);
rep(i, n) { rep(i, n) {
var[a[i] - 1] = i; int x;
ap[i].insert(oo); cin >> x;
var[x - 1] = i;
p[i].insert(oo);
} }
vi b(m); vi b(m);
rep(i, m) { rep(i, m) {
cin >> b[i]; cin >> b[i];
ap[var[b[i] - 1]].insert(i); b[i]--;
p[var[b[i]]].insert(i);
} }
int sz = n; vi df(n - 1);
while (__builtin_popcount(sz) != 1) { int c = 0;
sz++; rep(i, n - 1) {
df[i] = *p[i + 1].begin() - *p[i].begin();
c += df[i] < 0;
} }
V<ordered_set<pair<int, int>>> seg(sz * 2);
vl sum(sz * 2);
nrep(i, sz, sz * 2) {
seg[i].insert({oo, i - sz});
}
for (int i = sz - 1; i > 0; i--) {
repv(j, seg[i * 2]) {
seg[i].insert(j);
}
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;
}
};
rep(i, n) {
update(i, *ap[i].begin());
}
auto check = [&]() {
string ans[] = { string ans[] = {
"TIDAK", "TIDAK",
"YA" "YA"
}; };
cout << ans[sum[1] == 0] << '\n';
cout << ans[c == 0] << '\n';
auto rem = [&](int i) {
if (i < n - 1 && df[i] < 0) {
c--;
}
if (i > 0 && df[i - 1] < 0) {
c--;
}
};
auto add = [&](int i) {
if (i < n - 1) {
df[i] = *p[i + 1].begin() - *p[i].begin();
c += df[i] < 0;
}
if (i > 0) {
df[i - 1] = *p[i].begin() - *p[i - 1].begin();
c += df[i - 1] < 0;
}
}; };
check();
while (q--) { while (q--) {
int i, j; int i, j;
cin >> i >> j; cin >> i >> j;
i--; i--, j--;
int bf = b[i]; int bf = b[i];
b[i] = j; b[i] = j;
int actbf = var[bf - 1]; j = var[j];
int actb = var[b[i] - 1]; bf = var[bf];
rem(bf);
p[bf].erase(i);
add(bf);
rem(j);
p[j].insert(i);
add(j);
ap[actbf].erase(i); cout << ans[c == 0] << '\n';
ap[actb].insert(i);
update(actbf, *ap[actbf].begin());
update(actb, *ap[actb].begin());
check();
} }
} }

View File

@@ -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 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. 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 I already have the idea figured out, but my solution ended up getting TLE, I'll have to come
with something better. with something better.