제출 #1035311

#제출 시각아이디문제언어결과실행 시간메모리
1035311alexander707070Red-blue table (IZhO19_stones)C++17
100 / 100
38 ms2260 KiB
#include<bits/stdc++.h>
#define MAXN 1007
using namespace std;

int te,n,m,r,b,best;
int br[MAXN];

pair<int,int> p[MAXN];
char t[MAXN][MAXN];

void construct(int rows,int cols,int r,int b){
    int lim=rows-b;

    for(int i=1;i<=rows;i++)br[i]=0;

    for(int f=1;f<=cols;f++){
        for(int i=1;i<=rows;i++){
            p[i]={br[i],i};
        }

        sort(p+1,p+rows+1);

        for(int i=1;i<=lim;i++){
            t[p[i].second][f]='+';
            br[p[i].second]++;
        }

        for(int i=lim+1;i<=rows;i++){
            t[p[i].second][f]='-';
        }
    }
}

void build(int a,int b){
    for(int i=a+1;i<=n;i++){
        for(int f=1;f<=m;f++){
            t[i][f]='-';
        }
    }

    for(int f=b+1;f<=m;f++){
        for(int i=1;i<=n;i++){
            t[i][f]='+';
        }
    }

    construct(a,b,max(0, (m/2+b-m)+1 ) , max(0, (n/2+a-n)+1) );
}

bool ok(int A,int B){
    int reds=max(0, A* ((m/2+B-m)+1));
    int blues=max(0, B* ((n/2+A-n)+1));

    return reds+blues<=A*B;
}

void solve(){

    cin>>n>>m;
    
    int B=m,A=n;
    best=0;

    for(A=0;A<=n;A++){
        while(B>0 and !ok(A,B))B--;

        if(A+B>best){
            best=A+B;
            r=A; b=B;
        }
    }

    build(r,b);

    cout<<best<<"\n";
    for(int i=1;i<=n;i++){
        for(int f=1;f<=m;f++){
            cout<<t[i][f];
        }
        cout<<"\n";
    }
}

int main(){

    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin>>te;
    while(te>0){
        solve();
        te--;
    }
 
    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...