Submission #1223073

#TimeUsernameProblemLanguageResultExecution timeMemory
1223073overwatch9Light Bulbs (EGOI24_lightbulbs)C++20
57.44 / 100
34 ms464 KiB
#include <bits/stdc++.h>
using namespace std;
int n;
vector <string> query, actual, ans;
void print_query() {
    cout << "?" << endl;
    for (int i = 0; i < n; i++) {
        cout << query[i] << endl;
    }
}
void print_ans() {
    cout << "!" << endl;
    for (int i = 0; i < n; i++)
        cout << ans[i] << endl;
}
int main() {
    cin >> n;
    ans = actual = query = vector <string> (n);
    for (int i = 0; i < n; i++) {
        ans[i].resize(n, '0');
        actual[i].resize(n, '0');
        query[i].resize(n, '0');
    }
    bool found_ans = false;
    for (int i = 0; i < n && !found_ans; i++) {
        int l = 0, r = n; // binary search to find a 'H'
        while (l < r) {
            int mid = (l + r) / 2;

            if (mid == 0) {
                query[i][0] = query[i][1] = '1';
                print_query();
                query[i][0] = query[i][1] = '0';
                int res;
                cin >> res;
                if (res == n)
                    r = 0;
                else if (res == n*2) {
                    l = r = 1;
                } else { // res == n*2 - 1
                    query[i][0] = query[i][1] = query[i][2] = '1';
                    print_query();
                    query[i][0] = query[i][1] = query[i][2] = '0';

                    cin >> res;
                    if (res == n*2 + n-2) { // (i, 2) is vertical
                        query[i][0] = query[i][2] = '1';
                        print_query();
                        query[i][0] = query[i][2] = '0';
                        cin >> res;
                        if (res == 2 * n) {
                            l = r = 1;
                        } else
                            r = 0;
                    } else {
                        l = r = 2;
                    }

                }
            } else {

                for (int j = 0; j <= mid; j++)
                    query[i][j] = '1';
                for (int j = mid+1; j < n; j++)
                    query[i][j] = '0';

                print_query();
                int res;
                cin >> res;

                if (res == n * n) {
                    ans = query;
                    found_ans = true;
                    break;
                } else if (res % n == 0 && res != n) {
                    // all the points from 0 to mid are vertical points.
                    l = mid + 1;
                } else {
                    r = mid;
                }
            }

            

        }
        fill(query[i].begin(), query[i].end(), '0');
        ans[i][r] = '1';
    }
    print_ans();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...