Submission #1324798

#TimeUsernameProblemLanguageResultExecution timeMemory
1324798comet0Sličnost (COI23_slicnost)C++20
0 / 100
0 ms332 KiB
#include <bits/stdc++.h>
using namespace std;

struct SegTree {
    int n = 0;
    vector<int> mx, lazy, cnt;

    explicit SegTree(int n_ = 0) { init(n_); }

    void init(int n_) {
        n = n_;
        mx.assign(4 * n, 0);
        lazy.assign(4 * n, 0);
        cnt.assign(4 * n, 0);
        if (n > 0) build(1, 0, n - 1);
    }

    void build(int node, int l, int r) {
        if (l == r) {
            cnt[node] = 1;
            return;
        }
        int mid = (l + r) >> 1;
        build(node << 1, l, mid);
        build(node << 1 | 1, mid + 1, r);
        pull(node);
    }

    void apply(int node, int v) {
        mx[node] += v;
        lazy[node] += v;
    }

    void push(int node) {
        if (lazy[node] == 0) return;
        apply(node << 1, lazy[node]);
        apply(node << 1 | 1, lazy[node]);
        lazy[node] = 0;
    }

    void pull(int node) {
        int left = node << 1;
        int right = node << 1 | 1;
        mx[node] = max(mx[left], mx[right]);
        cnt[node] = 0;
        if (mx[left] == mx[node]) cnt[node] += cnt[left];
        if (mx[right] == mx[node]) cnt[node] += cnt[right];
    }

    void add(int ql, int qr, int v) { add(1, 0, n - 1, ql, qr, v); }

    void add(int node, int l, int r, int ql, int qr, int v) {
        if (ql > r || qr < l) return;
        if (ql <= l && r <= qr) {
            apply(node, v);
            return;
        }
        push(node);
        int mid = (l + r) >> 1;
        add(node << 1, l, mid, ql, qr, v);
        add(node << 1 | 1, mid + 1, r, ql, qr, v);
        pull(node);
    }

    int max_value() const { return mx[1]; }
    int max_count() const { return cnt[1]; }
};

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);

    int n, k;
    cin >> n >> k;
    vector<int> p(n), q(n);
    for (int &x : p) cin >> x;
    for (int &x : q) cin >> x;

    int m = n - k + 1;
    vector<int> pp(n + 1), pq(n + 1);
    for (int i = 0; i < n; i++) pp[p[i]] = i;
    for (int i = 0; i < n; i++) pq[q[i]] = i;

    struct Event {
        int l, r, delta;
    };
    vector<vector<Event>> e(m + 1);

    auto f = [&](int pos) -> pair<int, int> {
        int l = max(0, pos - k + 1);
        int r = min(m - 1, pos);
        return {l, r};
    };

    for (int x = 1; x <= n; x++) {
        auto [lx, rx] = f(pp[x]);
        auto [ly, ry] = f(pq[x]);
        e[lx].push_back({ly, ry, +1});
        if (rx + 1 <= m - 1) e[rx + 1].push_back({ly, ry, -1});
    }

    SegTree seg(m);
    int best = -1;
    int ways = 0;

    for (int sx = 0; sx < m; sx++) {
        for (const auto &e : e[sx]) seg.add(e.l, e.r, e.delta);
        int cur = seg.max_value();
        int cnt = seg.max_count();
        if (cur > best) {
            best = cur;
            ways = cnt;
        } else if (cur == best) {
            ways += cnt;
        }
    }

    cout << best << ' ' << ways;
}
#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...