#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
#pragma GCC target("avx2")
#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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |