Submission #1274522

#TimeUsernameProblemLanguageResultExecution timeMemory
1274522huhuhuhuhuMađioničar (COI22_madionicar)C++20
0 / 100
497 ms1848 KiB
#include <bits/stdc++.h>

using namespace std;

bool palindrome(long long l, long long r) {
  cout << "? " << l+1 << " " << r+1 << endl;
  cout << flush;
  long long ans = 0;
  cin >> ans;
  return ans == 1;
}

long long n, ans = 0;
long long len[200005];

int main() {
  cin >> n;
  long long center = 0, right = -1;
  for (int i = 0; i < n * 2 + 1; i++) {
    if (i > right) {
      // cout << "Out of bounds i" << endl;
      center = i;
      right = i;
      long long newRight = i + 1;
      while (newRight < n * 2 + 1) {
        long long left = center * 2 - newRight;
        if (left < 0) {
          break;
        }
        if (newRight % 2 == 1 && !palindrome(left/2, newRight/2)) {
          break;
        }
        right = newRight;
        newRight++;
      }
      // cout << "hi " << center << " " << right << endl;
      len[i] = right - center;
    } else if (i <= right) {
      long long mirror = center * 2 - i;
      if (mirror < 0) {
        // cout << "Mirror" << endl;
        center = i;
        right = i;
        long long newRight = right + 1;
        while (newRight < 2 * n + 1) {
          long long left = 2 * center - newRight;
          if (left < 0) {
            break;
          }
          if (newRight % 2 == 1 && !palindrome(left/2, newRight/2)) {
            break;
          }
          right = newRight;
          newRight++;
        }
        len[i] = right - center;
        continue;
      } 
      long long rightBounds = i + len[mirror];
      if (rightBounds < right) {
        len[i] = len[mirror];
      } else {
        center = i;
        right = i;
        long long newRight = right + 1;
        while (newRight < n * 2 + 1) {
          long long left = 2 * center - newRight;
          if (left < 0) {
            break;
          }

          // cout << "Expand " << newRight << endl;
          if (newRight % 2 == 1 && !palindrome(left/2, newRight/2)) {
            break;
          }
          right = newRight;
          newRight++;
        }
        // cout << "ok expand" << endl;
        len[i] = right - center;
      }
    }
    if (i % 2 == 0) {
      ans = max(ans,len[i]);
    } else {
      ans = max(ans,len[i]);
    }
  }
  cout << "! " << ans << endl;
  cout << flush;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...