QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#84058#5668. Cell Nuclei Detectionskittles1412AC ✓509ms181316kbC++173.8kb2023-03-05 08:34:152023-03-05 08:34:21

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-05 08:34:21]
  • 评测
  • 测评结果:AC
  • 用时:509ms
  • 内存:181316kb
  • [2023-03-05 08:34:15]
  • 提交

answer

#include "bits/extc++.h"

using namespace std;

template <typename T>
void dbgh(const T& t) {
    cerr << t << endl;
}

template <typename T, typename... U>
void dbgh(const T& t, const U&... u) {
    cerr << t << " | ";
    dbgh(u...);
}

#ifdef DEBUG
#define dbg(...)                                           \
    cerr << "L" << __LINE__ << " [" << #__VA_ARGS__ << "]" \
         << ": ";                                          \
    dbgh(__VA_ARGS__)
#else
#define cerr   \
    if (false) \
    cerr
#define dbg(...)
#endif

#define endl "\n"
#define long int64_t
#define sz(x) int(std::size(x))

namespace kactl {
#define rep(i, a, b) for (int i = a; i < (b); ++i)
#define all(x) begin(x), end(x)
using ll = long;
using pii = pair<int, int>;
using vi = vector<int>;


struct Dinic {
    struct Edge {
        int to, rev;
        ll c, oc;
        ll flow() { return max(oc - c, long(0)); } // if you need flows
    };
    vi lvl, ptr, q;
    vector<vector<Edge>> adj;
    Dinic(int n) : lvl(n), ptr(n), q(n), adj(n) {}
    void addEdge(int a, int b, ll c, ll rcap = 0) {
        adj[a].push_back({b, sz(adj[b]), c, c});
        adj[b].push_back({a, sz(adj[a]) - 1, rcap, rcap});
    }
    ll dfs(int v, int t, ll f) {
        if (v == t || !f) return f;
        for (int& i = ptr[v]; i < sz(adj[v]); i++) {
            Edge& e = adj[v][i];
            if (lvl[e.to] == lvl[v] + 1)
                if (ll p = dfs(e.to, t, min(f, e.c))) {
                    e.c -= p, adj[e.to][e.rev].c += p;
                    return p;
                }
        }
        return 0;
    }
    ll calc(int s, int t) {
        ll flow = 0; q[0] = s;
        rep(L,0,31) do { // 'int L=30' maybe faster for random data
            lvl = ptr = vi(sz(q));
            int qi = 0, qe = lvl[s] = 1;
            while (qi < qe && !lvl[t]) {
                int v = q[qi++];
                for (Edge e : adj[v])
                    if (!lvl[e.to] && e.c >> (30 - L))
                        q[qe++] = e.to, lvl[e.to] = lvl[v] + 1;
            }
            while (ll p = dfs(s, t, LLONG_MAX)) flow += p;
        } while (lvl[t]);
        return flow;
    }
    bool leftOfMinCut(int a) { return lvl[a] != 0; }
};

#undef rep
#undef all
}  // namespace kactl

constexpr int maxa = 2005;

vector<array<int, 3>> arr[maxa][maxa];

void solve() {
    for (auto& a : arr) {
        for (auto& b : a) {
            b.clear();
        }
    }
    int n, q;
    cin >> q >> n;
    int queries[q][4];
    for (auto& [x1, y1, x2, y2] : queries) {
        cin >> x1 >> y1 >> x2 >> y2;
    }
    for (int i = 0; i < n; i++) {
        int x1, y1, x2, y2;
        cin >> x1 >> y1 >> x2 >> y2;
        arr[x1][y1].push_back({x2, y2, i});
    }
    kactl::Dinic solver(n + q + 2);
    int src = n + q, sink = src + 1;
    for (int i = 0; i < n; i++) {
        solver.addEdge(src, i, 1);
    }
    for (int i = 0; i < q; i++) {
        solver.addEdge(n + i, sink, 1);
    }
    for (int i = 0; i < q; i++) {
        auto& [x1, y1, x2, y2] = queries[i];
        for (int x = max(x1 - 3, 0); x < x2; x++) {
            for (int y = max(y1 - 3, 0); y < y2; y++) {
                for (auto& [x3, y3, j] : arr[x][y]) {
                    int cx = min(x3, x2) - max(x, x1),
                        cy = min(y3, y2) - max(y, y1);
                    if (cx >= 0 && cy >= 0 &&
                        cx * cy * 2 >= (x2 - x1) * (y2 - y1)) {
                        solver.addEdge(j, n + i, 1);
                    }
                }
            }
        }
    }
    cout << solver.calc(src, sink) << endl;
}

int main() {
    cin.tie(nullptr);
    cin.exceptions(ios::failbit);
    ios_base::sync_with_stdio(false);
    int tcs;
    cin >> tcs;
    while (tcs--) {
        solve();
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 39ms
memory: 97652kb

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: 42ms
memory: 97596kb

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: 456ms
memory: 149848kb

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: 366ms
memory: 181316kb

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: 337ms
memory: 111572kb

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: 509ms
memory: 145768kb

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: 23ms
memory: 97656kb

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'