Advertisement
matheus_monteiro

Calendars

Sep 8th, 2021
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.59 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define bug(x) cout << #x << "  >>>>>>>  " << x << '\n'
  5. #define _ << " , " <<
  6. #define int long long
  7. #define esq node << 1LL
  8. #define dir (node << 1) | 1LL
  9.  
  10. const int MAX = 5e5+10;
  11. const int offset = 2e5+10;
  12.  
  13. int bit[MAX];
  14.  
  15. int query(int idx) {
  16.     int sum = 0;
  17.     for(; idx > 0; idx -= idx&-idx) sum += bit[idx];
  18.     return sum;
  19. }
  20.  
  21. void add(int idx, int k) {
  22.     idx += offset;
  23.     for(int i = idx; i < MAX; i += i&-i) bit[i] += k;
  24. }
  25.  
  26. int smallerCount(int v)  {
  27.     return query(v + offset);
  28. }
  29.  
  30. int32_t main() {
  31.  
  32.     ios_base::sync_with_stdio(false);
  33.     cin.tie(nullptr);
  34.  
  35.     int n;
  36.  
  37.     cin >> n;
  38.  
  39.     vector<int> posA(n), B(n);
  40.    
  41.     for(int i = 0; i < n; i++) {
  42.         int a;
  43.         cin >> a;      
  44.         posA[ a - 1 ] = i;
  45.     }
  46.  
  47.     vector<int> contribuition(n);
  48.     int cost = 0;
  49.  
  50.     for(int i = 0; i < n; i++) {
  51.         cin >> B[i]; B[i]--;
  52.         contribuition[ B[i] ] = posA[ B[i] ] - i;
  53.         add(contribuition[ B[i] ], 1);
  54.         cost += abs(contribuition[ B[i] ]);
  55.     }
  56.  
  57.     int aux = 0, ans = cost;
  58.  
  59.     for(int i = 0; i < n; i++) {
  60.         // remove a contribuição do primeiro elemento
  61.         cost -= abs(contribuition[ B[i] ] + aux);
  62.         add(contribuition[ B[i] ], -1);
  63.        
  64.         // shifta os outros n - 1
  65.         cost -= smallerCount(-aux-1);
  66.         cost += (n - smallerCount(-aux-1) - 1);
  67.  
  68.         // atualiza a contribuição do último
  69.        
  70.         contribuition[ B[i] ] = posA[ B[i] ] - (n - 1);
  71.         cost += abs(contribuition[ B[i] ]);
  72.         contribuition[ B[i] ] -= (aux + 1);
  73.         add(contribuition[ B[i] ], 1);
  74.  
  75.         // atualiza a resposta
  76.         ans = min(ans, cost);
  77.         aux++;
  78.     }
  79.  
  80.     cout << ans << endl;
  81.  
  82.     return 0;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement