QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#611798 | #8939. Permutation | UESTC_OldEastWest | TL | 0ms | 0kb | C++20 | 2.4kb | 2024-10-04 22:48:49 | 2024-10-04 22:48:51 |
Judging History
answer
#pragma GCC optimize("Ofast")
// #pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
const int N = 1e6 + 5;
const int M = 31;
const int INF = 1e9;
const double eps = 1e-8;
std::vector<std::vector<int> > dp, f;
void prep() {
dp = f = std::vector<std::vector<int> > (N, std::vector<int> (M));
std::function<int(int, int)> DFS = [&](int n, int m) {
if (n <= 1) return 0;
if (m <= -1) return INF;
if (dp[n][m]) return dp[n][m];
dp[n][m] = INF;
int mid = n - n / 3;
for (int i = std::max(1, int(0.6 * mid - 1)); i < std::min(n, int(0.7 * mid + 1)); i += int(0.1 * mid / 50) + 1) {
int new_val = std::max(DFS(i, m - 1), DFS(n - i, m - 2) + n - i) + i;
if (new_val < dp[n][m]) f[n][m] = i, dp[n][m] = new_val;
}
return dp[n][m];
};
for (int i = 2; i < N; ++i) {
int k = int(1.5 * log(i) / log(2) + 1.0);
for (int j = std::max(0, k - 3); j < k; ++j) DFS(i, j);
// if (DFS(i, k - 1) > 2 * i || !f[i][k - 1]) std::cout << '!';
}
// for (int i = 0; i < N; ++i) {
// for (int j = 0; j < M; ++j) {
// f[i][j] = int(0.618 * i);
// }
// }
}
void charming() {
int n; std::cin >> n;
std::function<int(int, int)> Send = [&](int l, int r) {
if (l == r) return -1;
std::cout << "? " << l << ' ' << r << '\n';
std::cout.flush();
int rcv; std::cin >> rcv;
return rcv;
};
std::function<void(int)> Answer = [&](int x) {
std::cout << "! " << x << '\n';
std::cout.flush();
};
int remain = int(1.5 * (log(n) / log(2)) + 1.0 + eps);
// std::cout << remain << '\n';
int l = 1, r = n, p = -1;
while (l < r) {
if (p == -1) p = Send(l, r), --remain;
if (l + 1 == r) {
if (p == l) ++l;
break;
}
int ask_len = f[r - l + 1][remain];
if (ask_len <= (r - l) / 2) ++ask_len;
// std::cout << f[r - l + 1][remain];
if (l + ask_len - 1 >= p) {
int q = Send(l, l + ask_len - 1); --remain;
if (q == p) r = l + ask_len - 1;
else l = l + ask_len, p = -1;
}
else {
int q = Send(r - ask_len + 1, r); --remain;
if (q == p) l = r - ask_len + 1;
else r = r - ask_len, p = -1;
}
}
Answer(l);
}
signed main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
std::cout.tie(NULL);
prep();
int t; std::cin >> t;
while (t--) charming();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Time Limit Exceeded
input:
3 5 3 3 2 1
output:
? 1 5 ? 1 4 ? 1 3 ? 1 2 ! 2