QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#113708 | #5668. Cell Nuclei Detection | UFRJ# | WA | 253ms | 104340kb | C++20 | 2.5kb | 2023-06-19 05:19:58 | 2023-06-19 05:20:01 |
Judging History
answer
#include<bits/stdc++.h>
namespace std {
struct bipartite_matching {
int N, M, T;
vector<vector<int>> adj;
vector<int> match, seen;
bipartite_matching(int a, int b) : N(a), M(a + b), adj(M),
match(M, -1), seen(M, -1), T(0) {}
void add_edge(int a, int b) {
assert(0 <= a && a < N && b + N < M && N <= b + N);
adj[a].push_back(b + N);
}
void shuffle_edges() { // useful to break some hairy tests
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
for (auto& cur : adj)
shuffle(cur.begin(), cur.end(), rng);
}
bool dfs(int cur) {
if (seen[cur] == T) return false;
seen[cur] = T;
for (int nxt : adj[cur])
if (match[nxt] == -1) {
match[nxt] = cur, match[cur] = nxt;
return true;
}
for (int nxt : adj[cur])
if (dfs(match[nxt])) {
match[nxt] = cur, match[cur] = nxt;
return true;
}
return false;
}
int solve() {
int res = 0;
while (true) {
int cur = 0; ++T;
for (int i = 0; i < N; ++i)
if (match[i] == -1) cur += dfs(i);
if (cur == 0) break;
else res += cur;
}
return res;
}
}; }
int main() {
using namespace std;
cin.tie(nullptr)->sync_with_stdio(false);
int T; cin >> T;
struct rectangle_t {
int idx;
int a, c, b, d;
rectangle_t intersection(rectangle_t r) {
return {0, max(r.a, a), max(r.c, c), min(r.b, b), min(r.d, d)};
}
int get_area() {
return (b > a && c < d ? (b - a) * (d - c) : 0);
}
};
const int L = 2022;
while (T--) {
int M, N; cin >> M >> N;
bipartite_matching flower(M, N);
vector<vector<vector<rectangle_t>>> R(L, vector(L, vector<rectangle_t>()));
for (int i = 0; i < M; ++i) {
int a, c, b, d; cin >> a >> c >> b >> d;
R[a][c].push_back({i, a, c, b, d});
}
for (int i = 0; i < N; ++i) {
int a, c, b, d;
cin >> a >> c >> b >> d;
rectangle_t box = {i, a, c, b, d};
for (int ac = a-4; ac <= a+4; ++ac) {
if (ac < 0) continue;
for (int bd = b-4; bd <= b+4; ++bd) {
if (bd < 0) continue;
for (auto r : R[ac][bd]) {
auto inter = box.intersection(r);
if (inter.get_area() * 2 >= r.get_area()) {
flower.add_edge(i, r.idx);
}
}
}
}
}
cout << flower.solve() << '\n';
}
}
详细
Test #1:
score: 100
Accepted
time: 64ms
memory: 99112kb
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: 44ms
memory: 99156kb
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: -100
Wrong Answer
time: 253ms
memory: 104340kb
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:
600 400 0 2594 150
result:
wrong answer 1st lines differ - expected: '50000', found: '600'