제출 #1350502

#제출 시각아이디문제언어결과실행 시간메모리
1350502AndreyTable Tennis (JOI24_tabletennis)C++17
0 / 100
0 ms580 KiB
#include<bits/stdc++.h>
using namespace std;

int ans[5001][5001];
vector<int> idk[5001];

void solve() {
    long long n,m;
    cin >> n >> m;
    for(int i = 0; i < n; i++) {
        idk[i].clear();
        for(int j = 0; j < n; j++) {
            ans[i][j] = 0;
        }
    }
    int k = -1,br = -1;
    for(long long i = 1; i <= n; i++) {
        br = i*(i-1LL)*(i-2LL)/6LL;
        long long z = (i-1)/2;
        if(i%2) {
            br-=(z*(z-1)/2)*i;
        }
        else {
            br-=(i/2)*(z*(z-1)/2+z*(z+1)/2);
        }
        if(br >= m) {
            k = i;
            break;
        }
    }
    if(k == -1) {
        cout << "No\n";
        return;
    }
    br-=m;
    vector<int> outd(n);
    for(int i = 1; i <= (k-1)/2; i++) {
        for(int j = 0; j < k; j++) {
            outd[j]++;
            ans[j][(j+i)%k] = 1;
        }
    }
    if(k%2 == 0) {
        for(int i = 0; i < k/2; i++) {
            outd[i]++;
            ans[i][i+k/2] = 1;
        }
    }
    for(int i = k; i < n; i++) {
        for(int j = 0; j < i; j++) {
            outd[i]++;
            ans[i][j] = 1;
        }
    }
    for(int i = 0; i < n; i++) {
        idk[outd[i]].push_back(i);
    }
    queue<int> banana;
    for(int i = 0; i < n; i++) {
        if(idk[i].size()) {
            banana.push(i);
        }
    }
    while(br > 0) {
        int x = banana.front();
        banana.pop();
        if(idk[x].size() < 2) {
            continue;
        }
        int a = idk[x][idk[x].size()-1],b = idk[x][idk[x].size()-2];
        idk[x].pop_back();
        idk[x].pop_back();
        if(ans[a][b] == 0) {
            swap(a,b);
        }
        ans[a][b] = 0;
        ans[b][a] = 1;
        idk[x-1].push_back(a);
        idk[x+1].push_back(b);
        if(idk[x-1].size() >= 2) {
            banana.push(x-1);
        }
        if(idk[x+1].size() >= 2) {
            banana.push(x+1);
        }
        br--;
    }
    cout << "Yes\n";
    for(int i = 1; i < n; i++) {
        for(int j = 0; j < i; j++) {
            cout << ans[i][j];
        }
        cout << "\n";
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int t;
    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...