QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#84050#5668. Cell Nuclei DetectionSvyatAC ✓413ms129032kbC++173.5kb2023-03-05 08:07:322023-03-05 08:07:35

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:07:35]
  • 评测
  • 测评结果:AC
  • 用时:413ms
  • 内存:129032kb
  • [2023-03-05 08:07:32]
  • 提交

answer

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

const int INF = 1e9;

class MaxFlow {
	int source;
	int sink;
	vector<int> to;
	vector<int> nxt;
	vector<int> head;
	vector<int> capacity;
	vector<int> distance;
	vector<int> ptr;
 
	void addEdge(int a, int b, int cap) {
		int eid = to.size();
		to.push_back(b);
		capacity.push_back(cap);
		nxt.push_back(head[a]);
		head[a] = eid;
	}
 
public:
	MaxFlow(int n, int source, int sink) {
		this->source = source;
		this->sink = sink;
		head.resize(n, -1);
		distance.resize(n);
	}
 
	void addDirectedEdge(int a, int b, int cap) {
		addEdge(a, b, cap);
		addEdge(b, a, 0);
	}
 
	bool bfs() {
		fill(distance.begin(), distance.end(), INT_MAX);
		distance[source] = 0;
		queue<int> q;
		q.push(source);
		while (!q.empty()) {
			int v = q.front();
			q.pop();
			for (int id = head[v]; id != -1; id = nxt[id]) {
				if (capacity[id] > 0 && distance[to[id]] > distance[v] + 1) {
					distance[to[id]] = distance[v] + 1;
					q.push(to[id]);
				}
			}
		}
		return distance[sink] != INT_MAX;
	}
 
	int dfs(int v, int flow) {
		if (v == sink) {
			return flow;
		}
		for (int &id = ptr[v]; id != -1; id = nxt[id]) {
			if (capacity[id] > 0 && distance[to[id]] == distance[v] + 1) {
				int pushed = dfs(to[id], min(flow, capacity[id]));
				if (pushed > 0) {
					capacity[id] -= pushed;
					capacity[id ^ 1] += pushed;
					return pushed;
				}
			}
		}
		return 0;
	}
 
	int maxFlow() {
		int res = 0;
		while (bfs()) { 
			ptr = head;
			while (int pushed = dfs(source, INT_MAX)) {
				res += pushed;
			}
		}
		return res;
	}
};

class Rect {
public:
	int x1, y1, x2, y2;

	Rect(int x1 = 0, int y1 = 0, int x2 = 0, int y2 = 0) : x1(x1), y1(y1), x2(x2), y2(y2) {}

	int area() {
		return (x2 - x1) * (y2 - y1);
	}
};

bool coverHalf(Rect &r1, Rect &r2) {
	Rect r;
	r.x1 = max(r1.x1, r2.x1);
	r.x2 = min(r1.x2, r2.x2);
	r.y1 = max(r1.y1, r2.y1);
	r.y2 = min(r1.y2, r2.y2);
	if (r.x1 < r.x2 && r.y1 < r.y2) {
		return r.area() * 2 >= r1.area();
	}
	return false;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	int tests;
	cin >> tests;
	while (tests--) {
		int m, n;
		cin >> m >> n;
		vector<vector<vector<int>>> bb(2001, vector<vector<int>>(2001));
		vector<Rect> rect(m + n);
		for (int i = 0; i < m + n; ++i) {
			cin >> rect[i].x1 >> rect[i].y1 >> rect[i].x2 >> rect[i].y2;
			assert(rect[i].x2 - rect[i].x1 <= 4);
			assert(rect[i].y2 - rect[i].y1 <= 4);
			assert(rect[i].x1 <= rect[i].x2);
			assert(rect[i].y1 <= rect[i].y2);             
			assert(rect[i].x1 >= 0 && rect[i].x1 <= 2000);
			assert(rect[i].y1 >= 0 && rect[i].y1 <= 2000);
			assert(rect[i].x2 >= 0 && rect[i].x2 <= 2000);
			assert(rect[i].y2 >= 0 && rect[i].y2 <= 2000);
		}
		for (int i = 0; i < m; ++i) {
			bb[rect[i].x1][rect[i].y1].push_back(i);
		}
		MaxFlow maxflow(n + m + 2, n + m, n + m + 1);
		for (int i = 0; i < n; ++i) {
			for (int x1 = max(0, rect[m + i].x1 - 4); x1 <= rect[m + i].x2; ++x1) {
				for (int y1 = max(0, rect[m + i].y1 - 4); y1 <= rect[m + i].y2; ++y1) {
					for (auto index : bb[x1][y1]) {
						if (coverHalf(rect[index], rect[m + i])) {
							maxflow.addDirectedEdge(index, m + i, 1);
						}
					}
				}
			}
		}
		for (int i = 0; i < m; ++i) {
			maxflow.addDirectedEdge(n + m, i, 1);
		}
		for (int i = 0; i < n; ++i) {
			maxflow.addDirectedEdge(m + i, n + m + 1, 1);
		}
		cout << maxflow.maxFlow() << endl;
	}
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 66ms
memory: 97040kb

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: 91ms
memory: 97044kb

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: 403ms
memory: 122568kb

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: 387ms
memory: 122280kb

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: 376ms
memory: 105668kb

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: 413ms
memory: 129032kb

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: 35ms
memory: 96908kb

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'