Submission #1130291

#TimeUsernameProblemLanguageResultExecution timeMemory
1130291gygSličnost (COI23_slicnost)C++20
100 / 100
826 ms42568 KiB
#include <bits/stdc++.h> using namespace std; #define arr array #define int long long #define pii pair<int, int> #define fir first #define sec second #define vec vector const int N = 1e5 + 5; int n, k, q; arr<int, N> a, b; struct Sg { struct Nd { int mx, nm, lzy; }; Nd mrg(Nd x, Nd y) { if (x.mx < y.mx) swap(x, y); return {x.mx, x.nm + ((y.mx == x.mx) ? y.nm : 0), 0}; } arr<Nd, 4 * N> sg; void bld(int u = 1, int lw = 1, int hg = n - k + 1) { if (lw == hg) { sg[u] = {0, 1, 0}; return; } int md = (lw + hg) / 2; bld(2 * u, lw, md), bld(2 * u + 1, md + 1, hg); sg[u] = mrg(sg[2 * u], sg[2 * u + 1]); } void prp(int u) { for (int v : {2 * u, 2 * u + 1}) sg[v].mx += sg[u].lzy, sg[v].lzy += sg[u].lzy; sg[u].lzy = 0; } void upd(int l, int r, int x, int u = 1, int lw = 1, int hg = n - k + 1) { l = max(l, 1ll), r = min(r, n - k + 1); if (r < lw || hg < l) return; if (l <= lw && hg <= r) { sg[u].mx += x, sg[u].lzy += x; return; } prp(u); int md = (lw + hg) / 2; upd(l, r, x, 2 * u, lw, md), upd(l, r, x, 2 * u + 1, md + 1, hg); sg[u] = mrg(sg[2 * u], sg[2 * u + 1]); } } sg; arr<int, N> ps; arr<vec<vec<int>>, N> qrys; // {id, decrease id, increase id} void prcmp() { for (int i = 1; i <= n; i++) ps[b[i]] = i; vec<pii> und; for (int j = 1; j <= q; j++) { int i; cin >> i; int lf_id = ps[a[i]], rg_id = ps[a[i + 1]]; swap(a[i], a[i + 1]), und.push_back({i, i + 1}); if (i - k + 1 >= 1) qrys[i - k + 1].push_back({j, lf_id, rg_id}); if (i + 1 <= n - k + 1) qrys[i + 1].push_back({j, rg_id, lf_id}); } reverse(und.begin(), und.end()); for (pii x : und) swap(a[x.fir], a[x.sec]); // for (int i = 1; i <= n; i++) { // cout << i << ": " << endl; // for (vec<int> x : qrys[i]) cout << x[0] << " " << x[1] << " " << x[2] << endl; // } } map<int, int> cnt; // Value for Q = 0 arr<vec<vec<int>>, N> rsps; void cmp() { sg.bld(); for (int i = 1; i <= k; i++) { int id = ps[a[i]]; sg.upd(id - k + 1, id, +1); } for (int i = 1; i <= n - k + 1; i++) { if (i != 1) { int lf_id = ps[a[i - 1]], rg_id = ps[a[i + k - 1]]; sg.upd(lf_id - k + 1, lf_id, -1); sg.upd(rg_id - k + 1, rg_id, +1); } cnt[sg.sg[1].mx] += sg.sg[1].nm; for (vec<int> x : qrys[i]) { vec<int> rsp; rsp.push_back(sg.sg[1].mx), rsp.push_back(sg.sg[1].nm); sg.upd(x[1] - k + 1, x[1], -1); sg.upd(x[2] - k + 1, x[2], +1); rsp.push_back(sg.sg[1].mx), rsp.push_back(sg.sg[1].nm); rsps[x[0]].push_back(rsp); } for (vec<int> x : qrys[i]) { sg.upd(x[1] - k + 1, x[1], +1); sg.upd(x[2] - k + 1, x[2], -1); } } // for (int i = 1; i <= q; i++) { // cout << i << ": " << endl; // for (vec<int> x : rsps[i]) cout << x[0] << " " << x[1] << " " << x[2] << " " << x[3] << endl; // } } void prnt() { cout << cnt.rbegin()->fir << " " << cnt.rbegin()->sec << endl; } void pstcmp() { prnt(); for (int i = 1; i <= q; i++) { for (vec<int> x : rsps[i]) { cnt[x[0]] -= x[1]; if (cnt[x[0]] == 0) cnt.erase(x[0]); cnt[x[2]] += x[3]; } prnt(); } } signed main() { // freopen("a.in", "r", stdin); cin >> n >> k >> q; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) cin >> b[i]; prcmp(), cmp(), pstcmp(); }
#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...