Submission #1340766

#TimeUsernameProblemLanguageResultExecution timeMemory
1340766goulthenLight Bulbs (EGOI24_lightbulbs)C++20
79.97 / 100
12 ms524 KiB
#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,b) for (int i = a; i <= b; i++)
#define per(i,a,b) for (int i = a; i >= b; i--)
#define pii pair<int,int>
#define pb push_back
#define all(v) (v).begin(), (v).end()

const int MAXN = 110;
int a[MAXN][MAXN],val[MAXN][MAXN], h[MAXN], v[MAXN],n;

mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());

void print(char ch) {
    cout << ch << " "<< endl;
    rep(i,1,n) {
        string s;
        rep(j,1,n) {
            s+=(char)(a[i][j]+'0');
        }
        cout << s << endl;
    }
}

int query() {
    print('?');
    int ans; cin >> ans;
    return ans;
}

void flip(const vector<int> ls) {
    assert(ls.size()%2==0);
    rep(i,0,ls.size()-1) {
        int x = ls[i], y = ls[i+1];
        a[x][y] = 1-a[x][y];
        i++;
    }
}
void flip(int x, int y) {
    a[x][y] = 1-a[x][y];
}

void zero(const vector<int> ls) {
    assert(ls.size()%2==0);
    rep(i,0,ls.size()-1) {
        int x = ls[i], y = ls[i+1];
        a[x][y] = 0;
        i++;
    }
}
void zero(int x, int y) {
    a[x][y] = 0;
}

// val-0 -> H
// val-1 -> V
int main() {
    cin >> n;
    rep(i,1,n) rep(j,1,n) val[i][j] = -1;

    flip({1,1,1,2});
    int x = query();
    if(x == n) {
        val[1][1] = val[1][2] = 0;
    }
    else if(x == 2*n) {
        val[1][1] = val[1][2] = 1;
    }
    else {
        flip({1,1,1,3});
        x = query();
        if(x==n) val[1][2] = val[1][3] = 0;
        else if (x==2*n) val[1][2] = val[1][3] = 1;

        flip({1,1,1,2});
        x = query();
        if(x==n) val[1][1] = val[1][3] = 0;
        else if (x==2*n) val[1][1] = val[1][3] = 1;

        if(val[1][1] == -1) val[1][1] = 1-val[1][2];
        if(val[1][2] == -1) val[1][2] = 1-val[1][1];
    }
    zero({1,1,1,2,1,3});
    flip(1,1);

    int i = 1, j = 1;
    while(i<=n && j <= n) {
        if(val[i][j]==-1) {
            flip(i,j);
            int x = query();
            if(x==2*n) val[i][j] = val[1][1];
            else val[i][j] = 1-val[1][1];
            flip(i,j);
        }

        if(val[i][j]) {
            v[j] = i;
            j++;
        } else {
            h[i] = j;
            i++;
        }
    } 

    zero(1,1);
    if(i>n) {
        rep(i,1,n) flip(i,h[i]);
        print('!');
    } else {
        rep(j,1,n) flip(v[j], j);
        print('!');
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...