Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define bug(x) cout << #x << " >>>>>>> " << x << '\n'
- #define _ << " , " <<
- #define int long long
- #define esq node << 1LL
- #define dir (node << 1) | 1LL
- const int MAX = 5e5+10;
- const int offset = 2e5+10;
- int bit[MAX];
- int query(int idx) {
- int sum = 0;
- for(; idx > 0; idx -= idx&-idx) sum += bit[idx];
- return sum;
- }
- void add(int idx, int k) {
- idx += offset;
- for(int i = idx; i < MAX; i += i&-i) bit[i] += k;
- }
- int smallerCount(int v) {
- return query(v + offset);
- }
- int32_t main() {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- int n;
- cin >> n;
- vector<int> posA(n), B(n);
- for(int i = 0; i < n; i++) {
- int a;
- cin >> a;
- posA[ a - 1 ] = i;
- }
- vector<int> contribuition(n);
- int cost = 0;
- for(int i = 0; i < n; i++) {
- cin >> B[i]; B[i]--;
- contribuition[ B[i] ] = posA[ B[i] ] - i;
- add(contribuition[ B[i] ], 1);
- cost += abs(contribuition[ B[i] ]);
- }
- int aux = 0, ans = cost;
- for(int i = 0; i < n; i++) {
- // remove a contribuição do primeiro elemento
- cost -= abs(contribuition[ B[i] ] + aux);
- add(contribuition[ B[i] ], -1);
- // shifta os outros n - 1
- cost -= smallerCount(-aux-1);
- cost += (n - smallerCount(-aux-1) - 1);
- // atualiza a contribuição do último
- contribuition[ B[i] ] = posA[ B[i] ] - (n - 1);
- cost += abs(contribuition[ B[i] ]);
- contribuition[ B[i] ] -= (aux + 1);
- add(contribuition[ B[i] ], 1);
- // atualiza a resposta
- ans = min(ans, cost);
- aux++;
- }
- cout << ans << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement