제출 #1156305

#제출 시각아이디문제언어결과실행 시간메모리
1156305Faisal_SaqibRed-blue table (IZhO19_stones)C++20
69 / 100
23 ms3084 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define ull unsigned long long
#define vll vector<ll>
#define pll pair<ll,ll>
#define pb push_back
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()

template<typename T>
using minpq = priority_queue<T, vector<T>, greater<T>>;
template<typename T>
using maxpq = priority_queue<T, vector<T>, less<T>>;

void input(vll&q)
{
    for(auto&i:q)cin>>i;
}
void pyn(bool x)
{
    cout<<(x?"YES":"NO")<<endl;
}
void pYN(bool x)
{
    cout<<(x?"Yes":"No")<<endl;
}
void pAB(bool x)
{
    cout<<(x?"Alice":"Bob")<<endl;
}
// ll get_ans(ll n,ll m)
pair<ll,vector<string>> get_ans(ll n,ll m)
{
    ll r=(m/2)+1; // red in row
    ll b=(m-r); // blue in row
    ll tb=b*n; // total blue in grid
    ll bm=(n/2)+1; // blue req in a single column
    // cout<<b<<' '<<tb<<' '<<bm<<endl;
    // return (n+min(m,(tb/bm)));
    // we can do (n-1) + b +b if n%2==1
    vector<string> ans;
    string cur(m,'+');
    for(int j=0;j<(m-r);j++)cur[j]='-';
    for(int i=0;i<(bm);i++)
    {
        ans.pb(cur);
    }
    for(int j=0;j<(m-r);j++)cur[j]='+',cur[m-1-j]='-';
    for(int i=0;i<(n-bm);i++)
    {
        ans.pb(cur);
    }
    // return {n+b,ans};
    if(n%2==0) // n>=2
    {
        // (n/2) + min(m,(b*(n/2)))
        pair<ll,vector<string>> cpr;
        if(b>=2)
        {
            reverse(all(ans));
            ans.pop_back();
            ans.pop_back();
            for(int j=0;j<m;j++)cur[j]='-';
                ans.pb(cur);
                ans.pb(cur);
            cpr={n-2+b+b,ans};
        }
        else
        {
            cpr={n+b,ans};
            // return
        }
        ll tp=(n/2)+min(m,(b*(n/2)));
        if(tp>cpr.first)
        {
            ans.clear();
            for(int j=0;j<m;j++)cur[j]='-';
            for(int i=0;i<n/2;i++)
            {
                ans.pb(cur);
            }
            for(int j=0;j<m;j++)cur[j]='+';
            for(int j=0;j<(m-r);j++)cur[j]='-';
            int shift=0;
            for(int i=0;i<n/2;i++)
            {
                string tp;
                for(int j=0;j<m;j++)tp+=cur[(j+shift)%m];
                ans.pb(tp);
                shift+=(m-r);
            }
            cpr={tp,ans};
        }
        return cpr;
        // (n-2) + b +b
    }
    else //n>=1
    {
        pair<ll,vector<string>> cpr;
        if(b>=1)
        {
            reverse(all(ans));
            ans.pop_back();
            for(int j=0;j<m;j++)cur[j]='-';
                ans.pb(cur);
            cpr={n-1+b+b,ans};
        }
        else
        {
            cpr={n+b,ans};
            // return
        }
        ll lvl=n-(n/2);
        ll tp=lvl+min(m,(b*lvl));
        if(tp>cpr.first)
        {
            ans.clear();
            for(int j=0;j<m;j++)cur[j]='-';
            for(int i=0;i<n/2;i++)
            {
                ans.pb(cur);
            }
            for(int j=0;j<m;j++)cur[j]='+';
            for(int j=0;j<(m-r);j++)cur[j]='-';
            int shift=0;
            for(int i=0;i<lvl;i++)
            {
                string tp;
                for(int j=0;j<m;j++)tp+=cur[(j+shift)%m];
                ans.pb(tp);
                shift+=(m-r);
            }
            cpr={tp,ans};
        }
        return cpr;
    }
    // return (n+b);
}
/*
---++++
+++-+--
++++---
-------
-------
-------
ans:10
*/
/*
Playground
--++++
++--++
++++--
------
------
------
ans:9

++++++
++++++
------
------
------
------
ans:8

--++++
--++++
----++
----++
++--++
++--++
ans:8
*/
void solve()
{
    // problem with even
    ll n,m;
    cin>>n>>m;
    auto mx=get_ans(n,m);

    if(mx>=get_ans(m,n))
    {
        cout<<mx.first<<endl;
        for(auto j:mx.second)
        {
            cout<<j<<endl;
        }
        // string cur(m,'+');
        // for(int i=0;i<((m-1)/2);i++)
        //     cur[i]='-';
        // cout<<mx_pos(n,m)<<endl;
        // for(int i=0;i<n;i++)
        //     cout<<cur<<endl;
    }
    else
    {
        mx=get_ans(m,n);
        cout<<mx.first<<endl;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                char c=mx.second[j][i];
                cout<<((c=='+')?'-':'+');
            }
            cout<<endl;
        }
    }
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--)solve();
}
#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...