QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#532948 | #5668. Cell Nuclei Detection | ttbchimbu999# | AC ✓ | 3610ms | 922860kb | C++20 | 4.7kb | 2024-08-25 14:59:13 | 2024-08-25 14:59:14 |
Judging History
answer
#include <bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define all(x) x.begin(), x.end()
using namespace std;
template <class X, class Y> bool minimize(X &a, Y b) {
if (a > b) return a = b, true;
return false;
}
template <class X, class Y> bool maximize(X &a, Y b) {
if (a < b) return a = b, true;
return false;
}
struct FlowEdge {
int u, v;
long long cap, flow = 0;
FlowEdge(int v, int u, long long cap) :
v(v), u(u), cap(cap) {}
};
struct Dinic {
const long long flow_inf = 1e18;
vector<FlowEdge> edges;
vector<vector<int>> adj;
int n, m = 0;
int s, t;
vector<int> level, ptr;
queue<int> q;
Dinic(int n, int s, int t) : n(n), s(s), t(t) {
adj.resize(n);
level.resize(n);
ptr.resize(n);
}
void add_edge(int v, int u, long long cap) {
edges.emplace_back(v, u, cap);
edges.emplace_back(u, v, 0);
adj[v].push_back(m);
adj[u].push_back(m + 1);
m += 2;
}
bool bfs() {
while (!q.empty()) {
int v = q.front();
q.pop();
for (int id: adj[v]) {
if (edges[id].cap - edges[id].flow < 1) {
continue;
}
if (level[edges[id].u] != -1) {
continue;
}
level[edges[id].u] = level[v] + 1;
q.push(edges[id].u);
}
}
return level[t] != -1;
}
long long dfs(int v, long long pushed) {
if (pushed == 0)
return 0;
if (v == t)
return pushed;
for (int &cid = ptr[v]; cid < (int) adj[v].size(); cid++) {
int id = adj[v][cid];
int u = edges[id].u;
if (level[v] + 1 != level[u] || edges[id].cap - edges[id].flow < 1)
continue;
long long tr = dfs(u, min(pushed, edges[id].cap - edges[id].flow));
if (tr == 0)
continue;
edges[id].flow += tr;
edges[id ^ 1].flow -= tr;
return tr;
}
return 0;
}
long long flow() {
long long f = 0;
while (true) {
fill(level.begin(), level.end(), -1);
level[s] = 0;
q.push(s);
if (!bfs())
break;
fill(ptr.begin(), ptr.end(), 0);
while (long long pushed = dfs(s, flow_inf)) {
f += pushed;
}
}
return f;
}
};
struct Rec_t {
int x[2];
int y[2];
void input() {
cin >> x[0] >> y[0] >> x[1] >> y[1];
// cerr << x[0] << ' ' << y[0] << ' ' << x[1] << ' ' << y[1] << '\n';
}
int get_rec() {
return (y[1] - y[0]) * (x[1] - x[0]);
}
friend int rec_intersect(Rec_t a, Rec_t b) {
int u = max(a.y[0], b.y[0]);
int d = min(a.y[1], b.y[1]);
int l = max(a.x[0], b.x[0]);
int r = min(a.x[1], b.x[1]);
// cerr << u << ' ' << d << ' ' << l << ' ' << r << '\n';
return (d - u) * (r - l);
}
};
const int N = 50005;
const int M = 2002;
vector<int> p[M][M];
Rec_t a[N];
Rec_t b[N];
void run_case() {
int n, m;
cin >> n >> m;
for (int i = 0; i < M; i++) {
for (int j = 0; j < M; j++) {
p[i][j].clear();
}
}
for (int i = 1; i <= n; i++) {
a[i].input();
// cerr << "##" << i << ": " << a[i].get_rec() << '\n';
}
for (int i = 1; i <= m; i++) {
b[i].input();
for (int x = b[i].x[0]; x <= b[i].x[1]; x++) {
for (int y = b[i].y[0]; y <= b[i].y[1]; y++) {
p[x][y].push_back(i);
}
}
}
// cerr << rec_intersect(a[1], b[2]) << '\n';
// return;
int s = 0, t = n + m + 1;
Dinic dinic(n + m + 3, s, t);
for (int i = 1; i <= n; i++) {
for (int x = a[i].x[0]; x <= a[i].x[1]; x++) {
for (int y = a[i].y[0]; y <= a[i].y[1]; y++) {
for (int j: p[x][y]) {
if (2 * rec_intersect(a[i], b[j]) >= a[i].get_rec()) {
// cerr << i << ' ' << j << '\n';
dinic.add_edge(i, j + n, 1);
}
}
}
}
}
for (int i = 1; i <= n; i++) {
dinic.add_edge(s, i, 1);
}
for (int i = 1; i <= m; i++) {
dinic.add_edge(i + n, t, 1);
}
cout << dinic.flow() << '\n';
}
signed main() {
cin.tie(0)->sync_with_stdio(0);
int t; cin >> t;
while (t --) {
run_case();
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 13ms
memory: 3784kb
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: 8ms
memory: 3784kb
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: 812ms
memory: 922860kb
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: 431ms
memory: 232164kb
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: 290ms
memory: 99160kb
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: 3610ms
memory: 906268kb
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: 7ms
memory: 3624kb
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'