Submission #1130284

#TimeUsernameProblemLanguageResultExecution timeMemory
1130284gygSličnost (COI23_slicnost)C++20
34 / 100
795 ms589824 KiB
#include <bits/stdc++.h> using namespace std; #define arr array #define pii pair<int, int> #define fir first #define sec second #define lint long long const int N = 1e5 + 5; int n, k, q; arr<int, N> a, b; struct Sg { struct Nd { int mx, nm, lzy; Nd *lf, *rg; Nd(int x, int y, int z = 0, Nd *l = nullptr, Nd *r = nullptr) { mx = x, nm = y, lzy = z, lf = l, rg = r; } Nd(Nd *l, Nd *r) { mx = max(l->mx, r->mx); nm = ((l->mx == mx) ? l->nm : 0) + ((r->mx == mx) ? r->nm : 0); lzy = 0, lf = l, rg = r; } }; arr<Nd*, N> rt; void prp(Nd *u, int lw, int hg) { int md = (lw + hg) / 2; if (!u->lf) u->lf = new Nd(0, md - lw + 1), u->rg = new Nd(0, hg - md); if (u->lzy == 0) return; u->lf = new Nd(u->lf->mx + u->lzy, u->lf->nm, u->lf->lzy + u->lzy, u->lf->lf, u->lf->rg); u->rg = new Nd(u->rg->mx + u->lzy, u->rg->nm, u->rg->lzy + u->lzy, u->rg->lf, u->rg->rg); u->lzy = 0; } Nd* upd(int l, int r, int x, Nd *u, int lw = 1, int hg = n - k + 1) { l = max(l, 1), r = min(r, n - k + 1); if (l <= lw && hg <= r) return new Nd(u->mx + x, u->nm, u->lzy + x, u->lf, u->rg); prp(u, lw, hg); int md = (lw + hg) / 2; if (r <= md) return new Nd(upd(l, r, x, u->lf, lw, md), u->rg); if (l > md) return new Nd(u->lf, upd(l, r, x, u->rg, md + 1, hg)); return new Nd(upd(l, r, x, u->lf, lw, md), upd(l, r, x, u->rg, md + 1, hg)); } } sg; arr<int, N> ps; map<int, lint> cnt; void prnt() { cout << cnt.rbegin()->fir << " " << cnt.rbegin()->sec << endl; } void prcmp() { for (int i = 1; i <= n; i++) ps[b[i]] = i; sg.rt[1] = new Sg::Nd(0, n - k + 1); for (int i = 1; i <= k; i++) { int id = ps[a[i]]; sg.rt[1] = sg.upd(id - k + 1, id, +1, sg.rt[1]); } for (int i = 2; i <= n - k + 1; i++) { int lf_id = ps[a[i - 1]], rg_id = ps[a[i + k - 1]]; sg.rt[i] = sg.upd(lf_id - k + 1, lf_id, -1, sg.rt[i - 1]); sg.rt[i] = sg.upd(rg_id - k + 1, rg_id, +1, sg.rt[i]); } for (int i = 1; i <= n - k + 1; i++) cnt[sg.rt[i]->mx] += sg.rt[i]->nm; // for (int i = 1; i <= n - k + 1; i++) { // cout << i << ": " << sg.rt[i]->mx << " " << sg.rt[i]->nm << endl; // } } void cmp() { prnt(); for (int j = 1; j <= q; j++) { int i; cin >> i; int lf_id = ps[a[i]], rg_id = ps[a[i + 1]]; if (i - k + 1 >= 1) { cnt[sg.rt[i - k + 1]->mx] -= sg.rt[i - k + 1]->nm; if (cnt[sg.rt[i - k + 1]->mx] == 0) cnt.erase(sg.rt[i - k + 1]->mx); sg.rt[i - k + 1] = sg.upd(lf_id - k + 1, lf_id, -1, sg.rt[i - k + 1]); sg.rt[i - k + 1] = sg.upd(rg_id - k + 1, rg_id, +1, sg.rt[i - k + 1]); cnt[sg.rt[i - k + 1]->mx] += sg.rt[i - k + 1]->nm; } if (i + 1 <= n - k + 1) { cnt[sg.rt[i + 1]->mx] -= sg.rt[i + 1]->nm; if (cnt[sg.rt[i + 1]->mx] == 0) cnt.erase(sg.rt[i + 1]->mx); sg.rt[i + 1] = sg.upd(lf_id - k + 1, lf_id, +1, sg.rt[i + 1]); sg.rt[i + 1] = sg.upd(rg_id - k + 1, rg_id, -1, sg.rt[i + 1]); cnt[sg.rt[i + 1]->mx] += sg.rt[i + 1]->nm; } swap(a[i], a[i + 1]); 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(); }
#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...