제출 #1220726

#제출 시각아이디문제언어결과실행 시간메모리
1220726SpyrosAlivLight Bulbs (EGOI24_lightbulbs)C++20
0 / 100
4073 ms408 KiB
#include <bits/stdc++.h> using namespace std; // n / height + max(n * log(height), n / height * logn) queries (hopefully) int H = 4; int n; int query(vector<vector<bool>> &grid) { cout << "? " << endl; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cout << grid[i][j]; } cout << endl; } int tot; cin >> tot; return tot; } void ans(vector<vector<bool>> &grid) { cout << "! " << endl; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cout << grid[i][j]; } cout << endl; } } int find_col(int st) { int lo = 1, hi = n; int fin = -1; while (lo <= hi) { int mid = (lo + hi) / 2; vector<vector<bool>> willAsk(n+1, vector<bool>(n+1, false)); for (int i = st; i <= min(n, st + H - 1); i++) { for (int j = 1; j <= mid; j++) { willAsk[i][j] = true; } } int tot = query(willAsk); if (tot <= (mid-1) * n + (n - (mid - 1))) { fin = mid; hi = mid-1; } else lo = mid+1; } return fin; } void get_good(int h) { while (true) { } vector<vector<bool>> finGrid(n+1, vector<bool>(n+1, false)); for (int j = 1; j <= n; j++) { int lo = h, hi = min(n, h + H - 1); int finIdx = -1; while (lo <= hi) { int mid = (lo + hi) / 2; vector<vector<bool>> willAsk(n+1, vector<bool>(n+1, false)); for (int i = h; i <= mid; i++) { willAsk[i][j] = true; } int tot = query(willAsk); int E = (mid - h) * n + n - (mid - h); if (tot <= E) { finIdx = mid; hi = mid-1; } else lo = mid+1; } finGrid[finIdx][j] = 1; } ans(finGrid); } void solve() { cin >> n; H = min(H, n - 1); for (int h = 1; h <= n; h += H) { vector<vector<bool>> willAsk(n+1, vector<bool>(n+1, false)); for (int i = h; i <= min(h + H - 1, n); i++) { for (int j = 1; j <= n; j++) { willAsk[i][j] = true; } } int tot = query(willAsk); if (tot == n*n) { get_good(h); return; } else continue; } vector<vector<bool>> finGrid(n+1, vector<bool>(n+1, false)); for (int h = 1; h <= n; h += H) { int col = find_col(h); for (int i = h; i <= min(n, h + H - 1); i++) { finGrid[i][col] = true; } } ans(finGrid); } int main() { int t = 1; while (t--) solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...