結果

問題 No.3591 I Love Graph
コンテスト
ユーザー shingo0909
提出日時 2026-07-17 22:14:50
言語 C++23
(gcc 15.2.0 + boost 1.90.0)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
RE  
実行時間 -
コード長 1,843 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,294 ms
コンパイル使用メモリ 349,612 KB
実行使用メモリ 5,888 KB
平均クエリ数 3099.47
最終ジャッジ日時 2026-07-17 22:14:58
合計ジャッジ時間 7,030 ms
ジャッジサーバーID
(参考情報)
judge3_0 / judge2_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 27 RE * 9
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
    cin.tie(nullptr);
    ios_base::sync_with_stdio(false);
    int n;
    cin >> n;
    set<pair<int, int>> ans;
    map<tuple<int, int, int, int>, bool> memo;
    function<bool(int, int, int, int)> query = [&](int l1, int r1, int l2, int r2) {
        if (memo.contains({l1, r1, l2, r2})) {
            return memo[{l1, r1, l2, r2}];
        }
        cout << "? " << r1 - l1 << " " << r2 - l2 << " ";
        for (int i = l1; i < r1; i++)
            cout << i + 1 << " ";
        for (int i = l2; i < r2; i++)
            cout << i + 1 << " ";
        cout << endl;
        int a;
        cin >> a;
        if (a == -1) {
            assert(false);
        }
        if (a == 1) {
            return memo[{l1, r1, l2, r2}] = true;
        } else {
            return memo[{l1, r1, l2, r2}] = false;
        }
    };

    function<void(int, int, int, int)>
        rec = [&](int l1, int r1, int l2, int r2) {
            if (l1 == r1 || l2 == r2)
                return;
            if (l1 + 1 == r1 && l2 + 1 == r2) {
                if (query(l1, r1, l2, r2)) {
                    ans.insert({l1, l2});
                };
                return;
            }
            int c1 = (l1 + r1) / 2;
            int c2 = (l2 + r2) / 2;
            rec(l1, c1, c1, r1);
            rec(l2, c2, c2, r2);
            if (query(l1, r1, l2, r2)) {
                rec(l1, c1, l2, c2);
                rec(l1, c1, c2, r2);
                rec(c1, r1, l2, c2);
                rec(c1, r1, c2, r2);
            }
            return;
        };
    int c = n / 2;
    rec(0, c, c, n);
    cout << "! " << ans.size() << endl;
    for (auto [u, v] : ans)
        cout << u + 1 << " " << v + 1 << endl;
    return 0;
}
0