Submission #1310002

#TimeUsernameProblemLanguageResultExecution timeMemory
1310002quollcucumber`Mađioničar (COI22_madionicar)C++20
0 / 100
1 ms332 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...