QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#111785 | #5668. Cell Nuclei Detection | xaphoenix# | AC ✓ | 3013ms | 137704kb | C++14 | 3.4kb | 2023-06-08 19:24:09 | 2023-06-08 19:24:14 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pf push_front
#define LC k<<1
#define RC k<<1|1
#define IO cin.sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define all(x) (x).begin(), (x).end()
#define SZ(x) ((int)(x).size())
#define rep(i,a,n) for (int i = a; i < n; i++)
#define repn(i,a,n) for (int i = a; i <= n; i++)
#define per(i,a,n) for (int i = (n) - 1; i >= a; i--)
#define pern(i,a,n) for (int i = n; i >= a; i--)
typedef long long LL;
typedef long double LD;
typedef unsigned long long ull;
typedef pair<int, int> PII;
typedef pair<int, LL> PIL;
typedef pair<LL, int> PLI;
typedef pair<double, double> PDD;
typedef pair<ull, ull> PUU;
typedef pair<LL, LL> PLL;
const int N = 110000;
const int M = 21000000;
const int mod = 1e9+7;
const int inf = (int)1e9;
const LL INF = 1e18;
const double eps = 1e-9;
mt19937_64 Rand((unsigned long long)new char);
#define rand Rand
struct rec {
int x1, y1, x2, y2, id;
void read(int _id) {
id = _id;
cin >> x1 >> y1 >> x2 >> y2;
if (x1 > x2) swap(x1, x2);
if (y1 > y2) swap(y1, y2);
}
int area() {
return (x2 - x1) * (y2 - y1);
}
}gt[N], dt[N];
int check(rec dt, rec gt) {
int x1 = max(dt.x1, gt.x1), x2 = min(dt.x2, gt.x2);
int y1 = max(dt.y1, gt.y1), y2 = min(dt.y2, gt.y2);
int area = max(x2 - x1, 0) * max(y2 - y1, 0);
return 2 * area >= gt.area();
}
int T, n, m;
struct MCMF {
// bfs, dinic
// st must be the lowest index, ed must be the highest index
int e[M], f[M], pre[M], last[N];
int d[N], now[N];
int num, st, ed, maxflow;
queue<int> q;
void init() {
num = 1;
repn(i, st, ed) last[i] = 0;
maxflow = 0;
}
void insert(int x, int y, int z) {
e[++num] = y, f[num] = z, pre[num] = last[x], last[x] = num;
e[++num] = x, f[num] = 0, pre[num] = last[y], last[y] = num;
}
bool bfs() {
memset(d, -1, sizeof(d));
d[st] = 0;
q.push(st);
while(!q.empty()) {
int now = q.front();
for (int i = last[now]; i; i = pre[i]) if (f[i] && d[e[i]] == -1) {
d[e[i]] = d[now] + 1;
q.push(e[i]);
}
q.pop();
}
if (d[ed] == -1) return 0;
return 1;
}
int dfs(int x, int incf) {
if (x == ed) return incf;
int flow = 0, w;
for (int i = now[x]; i; i = pre[i]) if (f[i] && d[e[i]] == d[x] + 1) {
w = dfs(e[i], min(incf - flow, f[i]));
f[i] -= w, f[i ^ 1] += w; flow += w;
if (f[i]) now[x] = i;
if (flow == incf) return incf;
}
if (!flow) d[x] = -1;
return flow;
}
void run() {
while(bfs()) {
repn(i, st, ed) now[i] = last[i];
maxflow += dfs(st, inf);
}
}
}solver;
const int L = 2100;
vector<rec> f[L][L];
int main() {
IO;
cin >> T;
while (T--) {
cin >> m >> n;
rep(i, 0, L) rep(j, 0, L) f[i][j].clear();
solver.st = 0, solver.ed = n + m + 1;
solver.init();
repn(i, 1, m) {
gt[i].read(i + n);
f[gt[i].x1][gt[i].y1].pb(gt[i]);
solver.insert(i + n, n + m + 1, 1);
}
repn(i, 1, n) {
dt[i].read(i);
solver.insert(0, i, 1);
repn(x, -4, 4) repn(y, -4, 4) {
int nx = dt[i].x1 + x, ny = dt[i].y1 + y;
if (nx < 0 || nx > L || ny < 0 || ny > L) continue;
for (auto p: f[nx][ny]) {
if (check(dt[i], p)) solver.insert(i, p.id, 1);
}
}
}
solver.run();
cout << solver.maxflow << "\n";
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 48ms
memory: 108856kb
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: 57ms
memory: 108868kb
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: 1649ms
memory: 131268kb
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: 302ms
memory: 137704kb
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: 317ms
memory: 114400kb
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: 3013ms
memory: 129888kb
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: 31ms
memory: 108812kb
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'