QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#524262 | #5668. Cell Nuclei Detection | ucup-team3699# | AC ✓ | 987ms | 175340kb | C++14 | 3.7kb | 2024-08-19 14:28:07 | 2024-08-19 14:28:09 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
const int N = 50005;
const int inf = 1e9;
struct dinic{
int s, t;
int n;
void init(int _n, int t1, int t2){
s = t1, t = t2; n = _n;
for(int i = 0; i < n; i++){
node[i].clear();
}
edge.clear();
}
struct Edge{
int to, cap, flow;
};
vector<Edge>edge;
vector<int> node[N << 1];
int cur[N << 1], dep[N << 1];
void add(int g, int h, int c){
node[g].push_back(edge.size());
edge.push_back({h, c, 0});
node[h].push_back(edge.size());
edge.push_back({g, 0, 0});
}
bool bfs(){
queue<int> now;
int vis[n + 1] = {0};
for(int i = 0; i < n; i++){
cur[i] = 0;
dep[i] = 0;
}
now.push(s);
vis[s] = 1;
dep[s] = 1;
while(now.size()){
int tt = now.front();
now.pop();
for(int &i = cur[tt]; i < node[tt].size(); i++){
int t1 = edge[node[tt][i]].to;
int t2 = edge[node[tt][i]].cap;
int t3 = edge[node[tt][i]].flow;
if(!vis[t1] && t2 > t3){
dep[t1] = dep[tt] + 1;
vis[t1] = 1;
now.push(t1);
}
}
}
return vis[t];
}
int dfs(int v, int tot){
if(v == t || tot == 0) return tot;
int ff = 0;
for(int &i = cur[v]; i < node[v].size(); i++){
int t1 = edge[node[v][i]].to;
int t2 = edge[node[v][i]].cap;
int t3 = edge[node[v][i]].flow;
if(t2 > t3 && dep[t1] == dep[v] + 1){
int g = dfs(t1, min(tot - ff, t2 - t3));
ff += g;
edge[node[v][i]].flow += g;
edge[node[v][i] ^ 1].flow -= g;
if(ff == tot)
return ff;
}
}
if(ff == 0)
dep[v] = 0;
return ff;
}
int flow(){
int ans = 0;
while(bfs()){
for(int i = 0; i < n; i++){
cur[i] = 0;
}
ans += dfs(s, inf);
}
return ans;
}
}din;
int x1[N << 1], yy1[N << 1], x2[N << 1], y2[N << 1];
vector<int> have[2005][2005];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while(t--){
for(int i = 0; i <= 2000; i++){
for(int j = 0; j <= 2000; j++){
have[i][j].clear();
}
}
int n, m;
cin >> n >> m;
din.init(n + m + 2, 0, n + m + 1);
for(int i = 1; i <= n; i++){
cin >> x1[i] >> yy1[i] >> x2[i] >> y2[i];
}
for(int i = n + 1; i <= n + m; i++){
cin >> x1[i] >> yy1[i] >> x2[i] >> y2[i];
}
for(int i = n + 1; i <= n + m; i++){
din.add(i, n + m + 1, 1);
for(int j = x1[i]; j < x2[i]; j++){
for(int k = yy1[i]; k < y2[i]; k++){
have[j][k].push_back(i);
}
}
}
for(int i = 1; i <= n; i++){
din.add(0, i, 1);
map<int, int> cnt;
for(int j = x1[i]; j < x2[i]; j++){
for(int k = yy1[i]; k < y2[i]; k++){
for(auto p : have[j][k]){
cnt[p] += 1;
}
}
}
for(auto p : cnt){
if(p.second * 2 >= (x2[i] - x1[i]) * (y2[i] - yy1[i])){
din.add(i, p.first, 1);
}
}
}
cout << din.flow() << '\n';
}
}
详细
Test #1:
score: 100
Accepted
time: 23ms
memory: 101668kb
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: 35ms
memory: 101680kb
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: 413ms
memory: 164528kb
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: 306ms
memory: 175340kb
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: 225ms
memory: 128452kb
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: 987ms
memory: 138040kb
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: 20ms
memory: 102396kb
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'