結果
| 問題 |
No.1306 Exactly 2 Digits
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-12-03 20:06:27 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 137 ms / 2,000 ms |
| コード長 | 2,680 bytes |
| コンパイル時間 | 1,845 ms |
| コンパイル使用メモリ | 179,764 KB |
| 実行使用メモリ | 25,580 KB |
| 平均クエリ数 | 1236.78 |
| 最終ジャッジ日時 | 2024-07-17 09:00:15 |
| 合計ジャッジ時間 | 15,665 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 123 |
コンパイルメッセージ
main.cpp: In lambda function:
main.cpp:35:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions]
35 | auto [p, q] = d;
| ^
ソースコード
#include <bits/stdc++.h>
int main()
{
int N;
std::cin >> N;
const int L = N * N - N;
using pii = std::pair<int, int>;
auto ask = [&](const int i, const int j) {
std::cout << "? " << i + 1 << " " << j + 1 << std::endl;
int p, q;
std::cin >> p >> q;
return std::make_pair(p, q);
};
auto fin = [&](const std::vector<int>& ans) {
std::cout << "!";
for (const int e : ans) { std::cout << " " << e; }
std::cout << std::endl;
};
auto diff = [&](const int m, const int n) { // m-n
int p = m / N - n / N, q = m % N - n % N;
if (p > q) { std::swap(p, q); }
return std::make_pair(p, q);
};
std::vector<pii> ds(L, {0, 0}); // ds[i] = as[i]-as[0]
for (int i = 1; i < L; i++) { ds[i] = ask(i, 0); }
std::vector<int> as(L, -1);
const int mi = std::min_element(ds.begin(), ds.end()) - ds.begin();
const int Mi = std::max_element(ds.begin(), ds.end()) - ds.begin();
as[mi] = N, as[Mi] = N * N - 1;
auto getcand = [&](const int n, const pii d) { // n, n-c
auto [p, q] = d;
std::vector<int> ans;
const int a = n / N, b = n % N;
if (1 <= a - p and a - p < N and 0 <= b - q and b - q < N) { ans.push_back((a - p) * N + (b - q)); }
if (p != q) {
std::swap(p, q);
if (1 <= a - p and a - p < N and 0 <= b - q and b - q < N) { ans.push_back((a - p) * N + (b - q)); }
}
return ans;
};
auto decide = [&](const int m, const pii& md, const int n, const pii& nd) { // m,m-c,n,n-c
std::vector<int> ans;
const auto cs = getcand(m, md);
for (const int c : cs) {
if (diff(n, c) == nd) { ans.push_back(c); }
}
return ans[0];
};
as[0] = decide(N, ds[mi], N * N - 1, ds[Mi]);
int ref = Mi;
{
const int p = as[0] / N, q = as[0] % N;
if (p == q) { ref = mi; }
}
std::vector<bool> used(N * N, false);
used[N] = used[as[0]] = used[N * N - 1] = true;
for (int i = 1; i < L; i++) {
const auto cs = getcand(as[0], pii{-ds[i].second, -ds[i].first});
if (cs.size() == 1) {
as[i] = cs[0];
} else if (cs.size() == 2) {
if (used[cs[0]]) {
as[i] = cs[1];
} else if (used[cs[1]]) {
as[i] = cs[0];
} else {
const auto d = ask(ref, i);
as[i] = decide(as[0], pii{-ds[i].second, -ds[i].first}, as[ref], d);
}
} else {
while (true) {}
}
used[as[i]] = true;
}
fin(as);
return 0;
}