QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#89528#5668. Cell Nuclei Detectionphtniit#AC ✓911ms220960kbC++113.1kb2023-03-20 13:34:152023-03-20 13:34:18

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-03-20 13:34:18]
  • 评测
  • 测评结果:AC
  • 用时:911ms
  • 内存:220960kb
  • [2023-03-20 13:34:15]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

typedef long long i64;
typedef pair<int, int> pii;

const int maxn = 2200000;
const int prm = 998244353;
const i64 inf = 1000000007;
const i64 inf2 = inf*inf;

vector<int> g[maxn];
int cur[maxn];
int ee, vv[maxn], cap[maxn], flow[maxn];
void init(int n) { // ATTENTION: TO BE CALLED
  ee = 0;
  for (int i = 1; i <= n; ++i) {
    g[i].clear();
  }
}
void adj(int u, int v, int w) {
  cap[ee] = w;
  flow[ee] = 0;
  vv[ee] = v;
  g[u].push_back(ee);
  ++ee;
  cap[ee] = 0;
  flow[ee] = 0;
  vv[ee] = u;
  g[v].push_back(ee);
  ++ee;
}

int dinic(int n, int S, int T) {
  static int lev[maxn];

  auto bfs = [&]() {
    for (int i = 1; i <= n; ++i) {
      cur[i] = 0;
      lev[i] = inf;
    }
    static queue<int> q;
    lev[S] = 0;
    q.push(S);
    while (!q.empty()) {
      int u = q.front(); q.pop();
      for (int i = 0; i < g[u].size(); ++i) {
        int e = g[u][i], v = vv[e];
        if (cap[e] > flow[e] && lev[v] == inf) {
          lev[v] = lev[u] + 1;
          q.push(v);
        }
      }
    }
  };

  std::function<int(int, int)> dfs = [&](int u, int c) {
    if (u == T) {
      return c;
    }
    int ret = 0;
    for (int& i = cur[u]; i < g[u].size(); ++i) {
      int e = g[u][i], v = vv[e];
      if (cap[e] <= flow[e] || lev[v] != lev[u] + 1) {
        continue;
      }
      int tmp = dfs(v, min(c, cap[e]-flow[e]));
      flow[e] += tmp;
      flow[e^1] -= tmp;
      ret += tmp;
      c -= tmp;
      if (c == 0) {
        break;
      }
    }
    return ret;
  };

  int ret = 0;
  while (true) {
    bfs();
    int tmp = dfs(S, inf);
    if (tmp == 0) {
      break;
    }
    ret += tmp;
  }
  return ret;
}

vector<int> G[2020][2020];
void once() {
  int m, n;
  scanf("%d %d", &m, &n);
  init(m+n+2);
  int S = m+n+1, T = S+1;
  for (int i = 1; i <= m; ++i) {
    adj(S, i, 1);
  }
  for (int i = 1; i <= n; ++i) {
    adj(i+m, T, 1);
  }

  for (int i = 1; i <= 2000; ++i) {
    for (int j = 1; j <= 2000; ++j) {
      G[i][j].clear();
    }
  }

  static int w[maxn];
  for (int i = 1; i <= m; ++i) {
    int u1, v1, u2, v2;
    scanf("%d %d %d %d", &u1, &v1, &u2, &v2);
    w[i] = (u2 - u1) * (v2 - v1);
    for (int j = u1+1; j <= u2; ++j) {
      for (int k = v1+1; k <= v2; ++k) {
        G[j][k].emplace_back(i);
      }
    }
  }

  static int a[maxn];
  for (int i = 1; i <= n; ++i) {
    vector<int> vt;

    int u1, v1, u2, v2;
    scanf("%d %d %d %d", &u1, &v1, &u2, &v2);
    for (int j = u1+1; j <= u2; ++j) {
      for (int k = v1+1; k <= v2; ++k) {
        for (auto e: G[j][k]) {
          vt.emplace_back(e);
        }
      }
    }

    for (auto e: vt) {
      a[e]++;
    }
    sort(vt.begin(), vt.end());
    vt.erase(unique(vt.begin(), vt.end()), vt.end());
    for (auto e: vt) {
      if (a[e] * 2 >= w[e]) {
        adj(e, i+m, 1);
      }
      a[e] = 0;
    }
  }

  printf("%d\n", dinic(T, S, T));
}
int main() {
  int tes;
  scanf("%d", &tes);
  while (tes--) {
    once();
  }
  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 75ms
memory: 150872kb

input:

3
2 2
1 1 3 3
3 3 5 5
2 2 4 4
4 4 6 6
2 3
1 1 3 3
3 3 5 5
1 3 3 5
2 1 4 5
3 1 5 3
3 3
1 1 2 2
2 2 3 3
3 3 4 4
1 1 3 3
2 2 4 4
3 3 5 5

output:

0
1
3

result:

ok 3 lines

Test #2:

score: 0
Accepted
time: 48ms
memory: 150864kb

input:

3
2 2
1 1 3 3
3 3 5 5
2 2 4 4
4 4 6 6
2 3
1 1 3 3
3 3 5 5
1 3 3 5
2 1 4 5
3 1 5 3
3 3
1 1 2 2
2 2 3 3
3 3 4 4
1 1 3 3
2 2 4 4
3 3 5 5

output:

0
1
3

result:

ok 3 lines

Test #3:

score: 0
Accepted
time: 517ms
memory: 205580kb

input:

5
50000 50000
0 0 4 4
4 0 8 4
8 0 12 4
12 0 16 4
16 0 20 4
20 0 24 4
24 0 28 4
28 0 32 4
32 0 36 4
36 0 40 4
40 0 44 4
44 0 48 4
48 0 52 4
52 0 56 4
56 0 60 4
60 0 64 4
64 0 68 4
68 0 72 4
72 0 76 4
76 0 80 4
80 0 84 4
84 0 88 4
88 0 92 4
92 0 96 4
96 0 100 4
100 0 104 4
104 0 108 4
108 0 112 4
112 ...

output:

50000
50000
0
50000
3150

result:

ok 5 lines

Test #4:

score: 0
Accepted
time: 480ms
memory: 220960kb

input:

5
50000 50000
0 0 1 1
1 0 2 1
2 0 3 1
3 0 4 1
4 0 5 1
5 0 6 1
6 0 7 1
7 0 8 1
8 0 9 1
9 0 10 1
10 0 11 1
11 0 12 1
12 0 13 1
13 0 14 1
14 0 15 1
15 0 16 1
16 0 17 1
17 0 18 1
18 0 19 1
19 0 20 1
20 0 21 1
21 0 22 1
22 0 23 1
23 0 24 1
24 0 25 1
25 0 26 1
26 0 27 1
27 0 28 1
28 0 29 1
29 0 30 1
30 0 ...

output:

50000
25050
12500
16000
8000

result:

ok 5 lines

Test #5:

score: 0
Accepted
time: 390ms
memory: 177608kb

input:

5
50000 50000
0 0 2 4
4 0 7 1
8 0 10 1
12 0 15 3
16 0 19 1
20 0 22 2
24 0 26 4
28 0 30 4
32 0 36 3
36 0 40 1
40 0 44 1
44 0 47 2
48 0 49 3
52 0 54 1
56 0 59 4
60 0 64 3
64 0 68 3
68 0 70 1
72 0 76 4
76 0 80 3
80 0 84 4
84 0 87 2
88 0 90 1
92 0 94 4
96 0 98 1
100 0 104 1
104 0 107 2
108 0 110 4
112 0...

output:

10594
10779
10618
10381
10779

result:

ok 5 lines

Test #6:

score: 0
Accepted
time: 911ms
memory: 181540kb

input:

5
50000 50000
0 0 4 4
1 0 5 4
2 0 6 4
3 0 7 4
4 0 8 4
5 0 9 4
6 0 10 4
7 0 11 4
8 0 12 4
9 0 13 4
10 0 14 4
11 0 15 4
12 0 16 4
13 0 17 4
14 0 18 4
15 0 19 4
16 0 20 4
17 0 21 4
18 0 22 4
19 0 23 4
20 0 24 4
21 0 25 4
22 0 26 4
23 0 27 4
24 0 28 4
25 0 29 4
26 0 30 4
27 0 31 4
28 0 32 4
29 0 33 4
30...

output:

50000
50000
50000
50000
49600

result:

ok 5 lines

Test #7:

score: 0
Accepted
time: 40ms
memory: 150964kb

input:

1
4 4
1 1 3 3
2 1 4 3
1 2 3 4
2 2 4 4
2 1 4 3
3 2 5 4
1 2 3 4
2 3 4 5

output:

3

result:

ok single line: '3'