Naxocist

reversal

Mar 23rd, 2024 (edited)
601
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.80 KB | Source Code | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. void dbg_out() { cerr << endl; }
  5. template<typename Head, typename... Tail>
  6. void dbg_out(Head H, Tail... T) { cerr << ' ' << H; dbg_out(T...); }
  7. #define dbg(...) cerr << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__)
  8.  
  9. template<typename S, typename T> S amax(S &a, const T &b) { if(b > a) a = b; return a; }
  10. template<typename S, typename T> S amin(S &a, const T &b) { if(b < a) a = b; return a; }
  11.  
  12. #define all(x) x.begin(), x.end()
  13. #define allrev(x) x.rbegin(), x.rend()
  14. #define pb emplace_back
  15. #define sz(x) (int) (x).size()
  16. #define ln '\n'
  17. using ll = long long;
  18. using pi = pair<ll, ll>;
  19. using T = tuple<ll, ll, ll>;
  20. const ll INF = 2e9;
  21. int n, sz, cnt;
  22. vector<int> a, b;
  23. unordered_map<int, int> t;
  24.  
  25. void f(int la, int ra, int lb, int rb, bool rev) {
  26.     if(la == ra || lb == rb) return ;
  27.  
  28.     int ma = (la+ra)/2, mb = (lb+rb)/2;
  29.     int s = ma - la + 1;
  30.  
  31.     if(!rev) for(int i=la; i<=ma; ++i) t[a[i]] ++;
  32.     else for(int i=ma+1; i<=ra; ++i) t[a[i]] ++;
  33.  
  34.     for(int j=mb+1; j<=rb; ++j) {
  35.         s -= t[b[j]] == 1;
  36.         if(t[b[j]]) t[b[j]]--;
  37.     }
  38.  
  39.     if(s != 0 and s != ma-la+1) {
  40.         cout << -1;
  41.         exit(0);
  42.     }
  43.  
  44.     if(s == ma-la+1) for(int j=lb; j<=mb; ++j) t[b[j]] --;
  45.  
  46.     int turn = rev;
  47.     if(s == 0) cnt ++, turn ++, rev = !rev;
  48.  
  49.     if(turn == 1) f(la, ma, mb+1, rb, rev), f(ma+1, ra, lb, mb, rev);
  50.     else f(la, ma, lb, mb, rev), f(ma+1, ra, mb+1, rb, rev);
  51. }
  52.  
  53. void runcase() {
  54.     cin >> n; sz = 1<<n;
  55.     a.resize(sz), b.resize(sz);
  56.     for(auto &x : a) cin >> x; for(auto &x : b) cin >> x;
  57.  
  58.     f(0, sz-1, 0, sz-1, 0);
  59.  
  60.     cout << cnt;
  61.     return ;
  62. }
  63.  
  64. int32_t main() {
  65.     cin.tie(nullptr)->sync_with_stdio(0);
  66.     int TC = 1;
  67.     // cin >> TC;
  68.     while(TC--) runcase();
  69.     return 0;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment