QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#40733#3569. Foul PlayFGgirlAC ✓514ms26368kbC++3.7kb2022-07-25 14:47:552022-07-25 14:47:56

Judging History

This is the latest submission verdict.

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-07-25 14:47:56]
  • Judged
  • Verdict: AC
  • Time: 514ms
  • Memory: 26368kb
  • [2022-07-25 14:47:55]
  • Submitted

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