QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#40733 | #3569. Foul Play | FGgirl | AC ✓ | 514ms | 26368kb | C++ | 3.7kb | 2022-07-25 14:47:55 | 2022-07-25 14:47:56 |
Judging History
answer
/* Code by Reflective-FG */
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define forr(i, a, b) for (int i = a; i <= b; i++)
#define rep(i, n) forr(i, 0, n-1)
#define repp(i, n) forr(i, 1, n)
#define pb push_back
#define mp make_pair
#define init(a, i) memset(a, i, sizeof(a))
#define fi first
#define se second
#define mod 1000000007
#define MOD 998244353
#define MAXN 0x3f3f3f3f
#define over(a) { cout << a; return; }
int T_, case_;
int n;
string f[2010];
int to[2000006], w[2000006], dep[100005];
int cnt;
int s, t;
vector<int>x, y;
vector<vector<int>>v;
int num[2010][2010];
void addedge(int i, int j) {
cnt++;
to[cnt] = j;
w[cnt] = 1;
v[i].pb(cnt);
cnt++;
to[cnt] = i;
w[cnt] = 0;
v[j].pb(cnt);
}
bool bfs() {
init(dep, 0);
dep[s] = 1;
queue<int> q;
q.push(s);
while (!q.empty()) {
int x = q.front();
q.pop();
if (v[x].size())rep(i, v[x].size())
if (w[v[x][i]] && !dep[to[v[x][i]]]) {
dep[to[v[x][i]]] = dep[x] + 1;
q.push(to[v[x][i]]);
}
}
return (dep[t] != 0);
}
int dfs(int k, int mn) {
if (k == t)
return mn;
int mmn = mn;
if (v[k].size()) {
rep(i, v[k].size()) {
if (dep[to[v[k][i]]] != dep[k] + 1 || !w[v[k][i]])
continue;
int x = dfs(to[v[k][i]], min(mn, w[v[k][i]]));
w[v[k][i]] -= x;
if (v[k][i] % 2 == 0)
w[v[k][i] + 1] += x;
else
w[v[k][i] - 1] += x;
mn -= x;
}
}
if (mmn == mn)
dep[k] = 0;
return mmn - mn;
}
bool vis[2010];
void match() {
rep(i, t + 1)v[i].clear();
// cout << "*\n";
// cout << "X: ";
// if (x.size())rep(i, x.size())cout << x[i] << ' ';
// cout << endl;
// cout << "Y: ";
// if (y.size())rep(i, y.size())cout << y[i] << ' ';
// cout << endl;
init(vis, 0);
if (!x.empty() && !y.empty()) {
init(num, -1);
cnt = -1;
rep(i, x.size())rep(j, y.size())
if (f[x[i]][y[j]] == '1') {
num[x[i]][y[j]] = cnt + 1;
addedge(x[i], y[j] + n);
}
rep(i, x.size()) addedge(s, x[i]);
rep(i, y.size())addedge(y[i] + n, t);
while (bfs())dfs(s, MAXN);
rep(i, x.size())rep(j, y.size())
if (num[x[i]][y[j]] != -1 && !w[num[x[i]][y[j]]]) {
cout << x[i] + 1 << ' ' << y[j] + 1 << endl;
vis[x[i]] = vis[y[j]] = 1;
}
}
// rep(i, n)cout << vis[i] << ' ';
// cout << endl;
vector<int>tmp1, tmp2;
tmp1.clear(), tmp2.clear();
if (x.size())rep(i, x.size()) {
if (vis[x[i]])tmp1.pb(x[i]);
else tmp2.pb(x[i]);
}
swap(x, tmp1);
if (y.size())rep(i, y.size())if (!vis[y[i]])tmp2.pb(y[i]);
y.clear();
if (tmp2.size())rep(i, tmp2.size()) {
int a = tmp2[i], b = tmp2[i + 1];
if (f[a][b] == '1') {
if (a == 0 || f[0][a] == '1')x.pb(a);
else y.pb(a);
}
else {
if (b == 0 || f[0][b] == '1')x.pb(b);
else y.pb(b);
}
cout << a + 1 << ' ' << b + 1 << endl;
++i;
}
}
void solve() {
s = 2 * n, t = 2 * n + 1;
v.resize(t + 1);
rep(i, n)cin >> f[i];
x.clear(), y.clear();
rep(i, n) {
if (!i || f[0][i] == '1')x.pb(i);
else y.pb(i);
}
rep(i, log2(n))match();
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
while (cin >> n)solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 514ms
memory: 26368kb
input:
4 0110 0011 0000 1010 8 00111010 10101111 00010010 01000101 00110010 10101011 00010000 10101010 2 01 00 4 0101 0000 1100 0110 4 0011 1000 0100 0110 4 0111 0000 0100 0110 4 0101 0010 1000 0110 4 0011 1010 0000 0110 4 0111 0010 0000 0110 4 0110 0001 0100 1010 4 0101 0001 1100 0010 4 0011 1001 0100 001...
output:
2 4 1 3 2 1 4 2 1 3 5 7 6 8 4 6 1 5 4 1 1 2 4 3 1 2 4 1 3 2 1 4 3 1 1 2 3 4 1 4 2 3 1 4 2 1 4 2 1 3 4 1 1 2 3 4 1 4 2 4 1 3 2 1 4 3 1 2 4 1 3 2 1 4 3 1 1 2 3 4 1 4 2 4 1 3 2 1 2 3 1 4 2 1 1 2 3 4 1 4 3 4 1 2 3 1 3 2 1 4 3 1 1 2 3 4 1 3 3 4 1 2 3 1 2 3 1 4 2 1 4 2 1 3 4 1 1 2 3 4 1 3 2 4 1 3 2 1 3 2 ...
result:
ok correct