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;
}