2025牛客多校第三场A

一、预处理

用a数组存下每一行/列的mex值,将二维数组的所有值填充为0。

二、填值

如果mex值为1,则不用填保持为0;如果mex值大于1,则在这一行列交汇处填1;如果mex值=2则continue到下一行列,如果mex值>2则从该行列的首到该点填数字,数字从2开始填到mex-1。

因为每行列的mex可能取到的最大值是递增的,数字从2开始填可以规避掉每行mex值与填入数字的讨论。

三、输出答案

双重循环输出。

#include<queue>
#include<cmath>
#include<algorithm>
#include<string>
#include<vector>
#include<cstring>
#include<map>
#include<set>
#include<unordered_map>
#include <iomanip>
#define endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef pair<int, int> pii;
typedef pair<double, int> pdi;
typedef pair<string, int> psi;
#define int long long
using namespace std;
const int mod = 998244353;
const int N = 5e5+9;
void solve() {
    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        vector<int>a(n);
        vector<vector<int>>b(n, vector<int>(n, 0));
        for (int i = 0; i < n; i++) {
            cin >> a[i];
            if (a[i] == 1)continue;
            b[i][i] = 1;
            if (a[i] > 2) {
                int t = 2;
                for (int j = 0; j <= i; j++) {
                   
                    if (j == i)continue;
                    if (t == a[i])continue;
                    else {
                        b[i][j] = t;
                        b[j][i] = t;
                        
                        if (t == a[i]-1) {
                            break;
                        }
                        t++;
                    }
                }
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                cout << b[i][j] << " ";
            }
            cout << endl;
        }
    }
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    solve();
    return 0;
}