Submission #1310001

#TimeUsernameProblemLanguageResultExecution timeMemory
1310001quollcucumber`Sličnost (COI23_slicnost)C++20
57 / 100
3095 ms21276 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct seg {
    int add;
    int num;
    int maxval;
};
#define MAXN 100005
seg tree[MAXN* 4];
seg merge(seg a, seg b) {
    if(a.maxval > b.maxval) return a;
    if(b.maxval > a.maxval) return b;
    return {0, a.num + b.num, a.maxval};
}
void prop(int node, int l, int r) {
    tree[node].maxval += tree[node].add;
    if(l + 1 != r) {
        tree[node * 2].add += tree[node].add;
        tree[node * 2 + 1].add += tree[node].add;
    }
    tree[node].add = 0;
}
void create(int pos = 1, int l = 0, int r = MAXN) {
    tree[pos].num = (r - l);
    int mid = (l + r ) / 2;
    if(l + 1 == r) return;
    create(pos * 2, l, mid);
    create(pos * 2 + 1, mid, r);
}
void upd(int left, int right,int add,  int pos = 1, int l = 0, int r = MAXN) {
    prop(pos, l, r);
    if(left <=  l && right >= r) {
        tree[pos].add += add;
        prop(pos, l, r);
        return;
    }
    int mid = (l + r) / 2;
    if(left < mid) {
        upd(left, right, add, pos * 2, l, mid);
    }
    if(right > mid) {
        upd(left, right, add, pos *2 +  1, mid, r);
    }
    prop(pos, l, r);
    prop(pos * 2, l, mid);
    prop(pos * 2 + 1, mid, r);
    tree[pos] = merge(tree[pos* 2 + 1],tree[pos * 2]);
}
int n, k, q;
pair<int, int> score(int * a, int  *b) {
    for(int i = 0; i < MAXN* 4; i++) tree[i] = {0, 1, 0};
    create(1, 0, MAXN);
    vector<pair<int, pair<bool, pair<int, int>>>> v;
    int positiona[n];
    int positionb[n];
    for(int i = 0; i < n; i++) {
        positiona[a[i]] = i;
        positionb[b[i]] = i;
    }
    for(int i = 0; i < n; i++) {
        int apos = positiona[i];
        int bpos = positionb[i];
        int aposmin = max(0ll, apos - k + 1);
        int aposmax = min(n-k, apos);
        int bposmin = max(0ll, bpos - k + 1);
        int bposmax = min(n-k, bpos);
        v.push_back({bposmin, {true, {aposmin, aposmax}}});
        v.push_back({bposmax+1, {false, {aposmin, aposmax}}});
    }
    sort(v.begin(), v.end());
    int maxval = 0;
    int dist = 0;
    for(int i = 0; i < v.size(); i++) {
        if(v[i].first + k > n) break;
        while(i != v.size()-1 && v[i].first == v[i + 1].first) {
            if(v[i].second.first) {
                upd(v[i].second.second.first, v[i].second.second.second+1, 1);
            }else {
                upd(v[i].second.second.first, v[i].second.second.second+1, -1);
            }
            i++;
        }
        if(v[i].second.first) {
            upd(v[i].second.second.first, v[i].second.second.second+1, 1);
        }else {
            upd(v[i].second.second.first, v[i].second.second.second+1, -1);
        }
        prop(1, 0, MAXN);
        if(tree[1].maxval > maxval) {
            maxval = tree[1].maxval;
            dist = (v[i+1].first - v[i].first) * tree[1].num;
        }else if(tree[1].maxval == maxval) {
            dist += (v[i+1].first - v[i].first) * tree[1].num;
        }
    }
    return {maxval, dist};
}
signed main() {
    cin >> n >> k >> q;
    int a[n], b[n];
    for(int i = 0; i < n; i++) {
        cin >> a[i];
        a[i]--;
    }
    for(int i = 0; i < n; i++) {
        cin >>b[i];
        b[i]--;
    }
    pair<int, int> val = score(a, b);
    cout<<val.first<<' '<<val.second<<'\n';
    for(int i = 0; i < q; i++) {
        int pos;
        cin >> pos;
        pos--;
        int thing = a[pos];
        a[pos] = a[pos + 1];
        a[pos + 1] = thing;
        val = score(a, b);
        cout<<val.first<<' '<<val.second<<'\n';
    }
    return 0;
}
#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...