Advertisement
hsiuyee

I. Lulu And The Magical Array

Oct 9th, 2024 (edited)
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.27 KB | None | 0 0
  1. #include <algorithm>
  2. #include <queue>
  3. #include <vector>
  4. #include <set>
  5. #include <iostream>
  6. #include <map>
  7. #include <iomanip>
  8.  
  9. using namespace std;
  10.  
  11. #define ll long long
  12. #define fastio ios::sync_with_stdio(false), cin.tie(0);
  13. #define pll pair<ll, ll>
  14. #define pdd pair<double, double>
  15. #define F first
  16. #define S second
  17. #define pb push_back
  18. #define ppb pop_back
  19. #define mkp make_pair
  20. #define sz(a) (ll) a.size()
  21. #define all(x) x.begin(), x.end()
  22. #define rep(i, n) for (ll i = 1; i <= n; i++)
  23. #define lowbit(x) x &(-x)
  24.  
  25. ll N;
  26.  
  27. // l is 0 r is 1
  28. struct Node{
  29.   ll x;
  30.   Node *l, *r;
  31.   Node(){x = 0, l = r = NULL;};
  32. };
  33.  
  34. void build(Node *v, ll x, ll level){
  35.   v->x++;
  36.   if(level == -1) return;
  37.   if(x & (1ll << level)){
  38.     if(v->r == NULL) v->r = new Node();
  39.     build(v->r, x, level - 1);
  40.   }
  41.   else{
  42.     if(v->l == NULL) v->l = new Node();
  43.     build(v->l, x, level - 1);
  44.   }
  45. }
  46.  
  47. ll DFS(ll x, Node *v, ll level, ll flag){
  48.   ll rev = 0;
  49.   if(level == -1) return 0ll;
  50.   if(x & (1ll << level)){
  51.     // cerr << (v->r != NULL) << " " << (v->r->x > flag) << endl;
  52.     if(v->r != NULL and v->r->x > flag){
  53.       rev += DFS(x, v->r, level - 1, flag);
  54.     }
  55.     else{
  56.       // cerr << x << " 0 " << level << endl;
  57.       rev += (1ll << level);
  58.       rev += DFS(x, v->l, level - 1, 0);
  59.     }
  60.   }
  61.   else{
  62.     if(v->l != NULL and v->l->x > flag){
  63.       rev += DFS(x, v->l, level - 1, flag);
  64.     }
  65.     else{
  66.       // cerr << x << " 1 " << level << endl;  
  67.       rev += (1ll << level);
  68.       rev += DFS(x, v->r, level - 1, 0);
  69.     }
  70.   }
  71.   return rev;
  72. }
  73.  
  74. void solve(){
  75.   cin >> N;
  76.   vector<ll> a;
  77.   ll x;
  78.   ll ans = (1ll << 31);
  79.   for(ll i = 2; i <= N; i++){
  80.     cout << "? " << 1 << " " << i << '\n';
  81.     cout << flush;
  82.     cin >> x;
  83.     a.push_back(x);
  84.     ans = min(ans, x);
  85.   }
  86.   if(N == 2){
  87.     cout << "! " << ans << '\n';
  88.     cout << flush << '\n';
  89.     return;
  90.   }
  91.   Node *root = new Node();
  92.   for(ll i = 0; i < a.size(); ++i){
  93.     build(root, a[i], 30);
  94.   }
  95.   for(ll i = 0; i < a.size(); ++i){
  96.     ll res = DFS(a[i], root, 30, 1);
  97.     ans = min(ans, res);
  98.   }
  99.   cout << "! " << ans << '\n';
  100.   cout << flush << '\n';
  101. }
  102.  
  103. signed main() {
  104.   fastio ll T = 1;
  105.   cin >> T;
  106.   for (ll i = 1; i <= T; i++) {
  107.     solve();
  108.   }
  109.   return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement