QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#524262#5668. Cell Nuclei Detectionucup-team3699#AC ✓987ms175340kbC++143.7kb2024-08-19 14:28:072024-08-19 14:28:09

Judging History

你现在查看的是最新测评结果

  • [2024-08-19 14:28:09]
  • 评测
  • 测评结果:AC
  • 用时:987ms
  • 内存:175340kb
  • [2024-08-19 14:28:07]
  • 提交

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';
    }
}

Details

Tip: Click on the bar to expand more detailed information

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'