rt,O(n3) 过了。
理论上只能通过 Subtask 1。
#include <bits/stdc++.h>
using namespace std;
int n, m, c, r, a[1005][1005];
int p[1005], q[1005];
inline int solveFirst() {
int ans = 0, minn = 1e9;
for (int i = 1; i <= n; i++) {
if (p[i] == 0) continue;
int res = 1e9;
for (int j = 1; j <= n; j++)
if (q[j] != 0)
res = min(res, a[i][j]);
if (res < minn) {
minn = res;
ans = i;
}
}
return ans;
}
bool flag[1005];
inline int solveSecond() {
memset(flag, 0, sizeof flag);
for (int i = 1; i <= n; i++) {
if (p[i] == 0) continue;
int minn = 1e9, res = 0;
for (int j = 1; j <= n; j++)
if (q[j] != 0 && minn > a[i][j])
minn = a[i][j],
res = j;
flag[res] = 1;
}
for (int i = 1; i <= n; i++)
if (q[i] != 0 && flag[i] == 0)
return i;
}
int main() {
ios::sync_with_stdio(false); cin.tie(0), cout.tie(0);
cin >> n >> m >> c;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cin >> a[i][j];
for (int i = 1; i <= n; i++)
cin >> p[i];
for (int i = 1; i <= n; i++)
cin >> q[i];
for (int i = 1; i <= n; i++) {
if (c == 0) {
while (p[i] > 1) {
cout << i << endl;
p[i]--;
cin >> r;
q[r]--;
}
}
else {
while (q[i] > 1) {
cin >> r;
p[r]--;
cout << i << endl;
q[i]--;
}
}
}
for (int i = 1; i < n; i++) {
if (c == 0) {
r = solveFirst();
p[r]--;
cout << r << endl;
cin >> r;
q[r]--;
}
else {
cin >> r;
p[r]--;
r = solveSecond();
q[r]--;
cout << r << endl;
}
}
return 0;
}