제출 #1328345

#제출 시각아이디문제언어결과실행 시간메모리
1328345syanvuSličnost (COI23_slicnost)C++20
50 / 100
153 ms14312 KiB
#include <bits/stdc++.h>

#define SS ios_base::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);
#define int long long
#define all(v) v.begin(),v.end()
using namespace std;

const int N = 2e5 + 1, MX = 40, inf = 1e18, mod = 1e9 + 7;

struct node{
    int mx, cnt;
};

node t[4 * N];
int add[4 * N];

void push(int v, int tl, int tr){
    t[v].mx += add[v];
    if(tl < tr){
        add[v * 2] += add[v];
        add[v * 2 + 1] += add[v];
    }
    add[v] = 0;
}

node f(node a, node b){
    node res;
    if(a.mx > b.mx) res = a;
    else if(b.mx > a.mx) res = b;
    else if(a.mx == b.mx){
        res = a;
        res.cnt += b.cnt;
    }
    return res;
}
void build(int v, int tl, int tr){
    if(tl == tr){
        t[v] = {0, 1};
        return;
    }
    int mid = (tl + tr) / 2;
    build(v * 2, tl, mid);
    build(v * 2 + 1, mid + 1, tr);
    t[v] = f(t[v * 2], t[v * 2 + 1]);
}
void upd(int v, int tl, int tr, int l, int r, int x){
    push(v, tl, tr);
    if(tl > r || l > tr) return;
    if(tl >= l && r >= tr){
        add[v] += x;
        push(v, tl, tr);
        return;
    }
    int mid = (tl + tr) / 2;
    upd(v * 2, tl, mid, l, r, x);
    upd(v * 2 + 1, mid + 1, tr, l, r, x);
    t[v] = f(t[v * 2], t[v * 2 + 1]);
}
node get(int v, int tl, int tr, int l, int r){
    push(v, tl, tr);
    if(tl > r || l > tr) return {0, 0};
    if(tl >= l && r >= tr) return t[v];
    int mid = (tl + tr) / 2;
    return f(get(v * 2, tl, mid, l, r), get(v * 2 + 1, mid + 1, tr, l, r));
}

void solve(){
    int n, k, q;
    cin >> n >> k >> q;
    int a[n + 1], b[n + 1];
    int p[n + 1];
    build(1, 1, n);
    for(int i = 1; i <= n; i++){
        cin >> a[i];
    }
    for(int i = 1; i <= n; i++){
        cin >> b[i];
        p[b[i]] = i;
    }
    vector<int> g[n + 1];
    int mx = 0, cnt = 0;
    for(int i = 1; i <= n; i++){
        for(int x : g[i]){
            upd(1, 1, n, p[x], min(n, p[x] + k - 1), -1);
        }
        upd(1, 1, n, p[a[i]], min(p[a[i]] + k - 1, n), 1);
        if(i + k <= n) g[i + k].push_back(a[i]);
        if(i < k) continue;
        node res = get(1, 1, n, k, n);
        if(res.mx > mx){
            mx = res.mx;
            cnt = res.cnt;
        }
        else if(res.mx == mx) cnt += res.cnt;
        // cout << res.mx << ' ' << res.cnt << '\n';
    }
    cout << mx << ' ' << cnt << '\n';
}

signed main(){
    SS
    // freopen("trains.in", "r", stdin);
    // freopen("trains.out", "w", stdout);

    int t = 1;
    // cin >> t;
    while(t--){
        solve();
    }
}
#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...