Submission #677684

#TimeUsernameProblemLanguageResultExecution timeMemory
677684AlcabelRed-blue table (IZhO19_stones)C++17
100 / 100
40 ms2216 KiB
#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<int> delta;

bool check(int a, int b) {
    int need = n / 2 + 1 - (n - a);
    if (need <= 0) { return true; }
    for (int i = 0, cur = 0; i < b; ++i) {
        if (cur + need <= a) {
            ++delta[cur];
            --delta[cur + need];
            cur += need;
        } else {
            ++delta[cur];
            --delta[a];
            ++delta[0];
            --delta[cur + need - a];
            cur = cur + need - a;
        }
    }
    bool able = true;
    for (int i = 0, cur = 0; i < a; ++i) {
        cur += delta[i];
        if (m - cur < m / 2 + 1) {
            able = false;
        }
        delta[i] = 0;
    }
    delta[a] = 0;
    return able;
}

void solve() {
    cin >> n >> m;
    pair<int, int> ans = {0, 0};
    delta.resize(n + 1);
    for (int a = 0; a <= n; ++a) {
        int left = 0, right = m + 1;
        while (right - left > 1) {
            int mid = left + (right - left) / 2;
            if (check(a, mid)) {
                left = mid;
            } else {
                right = mid;
            }
        }
        if (ans.first + ans.second < a + left) {
            ans.first = a, ans.second = left;
        }
    }
    cout << ans.first + ans.second << '\n';
    vector<vector<char>> t(n, vector<char>(m));
    for (int i = 0; i < ans.first; ++i) {
        for (int j = 0; j < m; ++j) {
            t[i][j] = '+';
        }
    }
    for (int i = ans.first; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            t[i][j] = '-';
        }
    }
    int need = n / 2 + 1 - (n - ans.first);
    if (need > 0) {
        for (int i = 0, cur = 0; i < ans.second; ++i) {
            for (int j = 0; j < need; ++j) {
                t[cur][i] = '-';
                ++cur;
                if (cur == ans.first) {
                    cur = 0;
                }
            }
        }
    }
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            cout << t[i][j];
        }
        cout << '\n';
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int T = 1;
    cin >> T;
    while (T--) {
        solve();
    }

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