QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#225414#5668. Cell Nuclei DetectionBUET_Twilight#TL 3633ms518536kbC++236.3kb2023-10-24 17:09:252023-10-24 17:09:25

Judging History

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

  • [2023-10-24 17:09:25]
  • 评测
  • 测评结果:TL
  • 用时:3633ms
  • 内存:518536kb
  • [2023-10-24 17:09:25]
  • 提交

answer

#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp> 
#include <ext/pb_ds/detail/standard_policies.hpp>
using namespace __gnu_pbds;
using namespace std;
#define getbit(n, i) (((n) & (1LL << (i))) != 0) 
#define setbit0(n, i) ((n) & (~(1LL << (i)))) 
#define setbit1(n, i) ((n) | (1LL << (i))) 
#define togglebit(n, i) ((n) ^ (1LL << (i))) 
#define lastone(n) ((n) & (-(n))) 
char gap = 32;
#define int long long
#define ll long long 
#define lll __int128_t
#define pb push_back
// #define double long double
#define pii pair<int,int>
typedef tree<
int,
null_type,
less<int>,
rb_tree_tag,
tree_order_statistics_node_update>
ordered_set;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
ll hashPrime = 1610612741;
typedef pair<double, double> pdd;
const double EPS = 1e-12;
const long long flow_inf = 1e18;
struct FlowEdge {
  int v,u,id; long long cap, flow = 0;
  FlowEdge(int v, int u, long long cap,int id=-1) : v(v), u(u), cap(cap),id(id) {}
};
struct Dinic
{
  vector<FlowEdge> edges; vector<vector<int> > adj;
  int n, m = 0; int s, t;
  vector<int> level, ptr,flow_through;
  queue<int> q; vector<bool>vis;
  int maxid=0;
  Dinic() {}
  Dinic(int n) : n(n) {
    vis.resize(n); adj.resize(n);
    level.resize(n); ptr.resize(n);
  }
  void add_edge(int v, int u, long long cap,int id=-1) {
    edges.emplace_back(v, u, cap,id);
    edges.emplace_back(u, v, 0);
    adj[v].push_back(m);
    adj[u].push_back(m + 1);
    m += 2;
    if(id!=-1)maxid++;
  }
  void dfs2(int s) {
    vis[s] = 1;
    for(int i:adj[s]) {
      int id = i; int u = edges[id].v;
      int v = edges[id].u;
      if(edges[id].flow!=edges[id].cap && !vis[v])
      {
        dfs2(v);
      }
    }
  }
  vector<int> getMinCut() {
    dfs2(s); vector<int>ret;
    for(int i=0; i<n; i++) {
      if(vis[i]) ret.push_back(i);
    }
    return ret;
  }
  bool bfs() {
    while (!q.empty()) {
      int v = q.front();
      q.pop();
      for (int id : adj[v])
      {
        if (edges[id].cap - edges[id].flow < 1)
          continue;
        if (level[edges[id].u] != -1)
          continue;
        level[edges[id].u] = level[v] + 1;
        q.push(edges[id].u);
      }
    }
    return level[t] != -1;
  }
  long long dfs(int v, long long pushed) {
    if (pushed == 0) return 0;
    if (v == t) return pushed;
    for (int& cid = ptr[v]; cid < (int)adj[v].size(); cid++){
      int id = adj[v][cid]; int u = edges[id].u;
      if (level[v] + 1 != level[u] || edges[id].cap - edges[id].flow < 1)
        continue;
      long long tr = dfs(u, min(pushed, edges[id].cap - edges[id].flow));
      if (tr == 0)
        continue;
      edges[id].flow += tr; edges[id ^ 1].flow -= tr;
      return tr;
    }
    return 0;
  }
  long long flow(int _s,int _t) {
    s=_s; t=_t;
    long long f = 0;
    while (true)
    {
      fill(level.begin(), level.end(), -1);
      level[s] = 0; q.push(s);
      if (!bfs()) break;
      fill(ptr.begin(), ptr.end(), 0);
      while (long long pushed = dfs(s, flow_inf)){
        f += pushed;
      }
    }
    flow_through.assign(maxid+1, 0);
    for(int i = 0; i < n; i++){
      for(auto j : adj[i]) {
        int idx = j;
        FlowEdge e = edges[idx];
        if(e.id >= 0)flow_through[e.id] = e.flow;
      }
    }
    return f;
  }
};

void solve() {
    int m, n; cin >> m >> n;

    vector<vector<map<pii, int>>> s(2001, vector<map<pii, int>>(2001)); 
    vector<pair<pii, pii>> g, d; 
    for(int i = 1; i <= m; i++) {
        int x1, y1, x2, y2;
        cin >> x1 >> y1 >> x2 >> y2;
        g.pb({{x1, y1}, {x2, y2}});
    }  
    int cnt = 1;
    vector<vector<map<int, int>>> mp1(2001, vector<map<int, int>>(2001)); 
    for(int i = 1; i <= n; i++) {

        int x1, y1, x2, y2;
        cin >> x1 >> y1 >> x2 >> y2;
        d.push_back({{x1, y1}, {x2, y2}});
        s[x1][y1][{x2, y2}]++;
        if(mp1[x1][y1].find(x2 * 2001 + y2) == mp1[x1][y1].end()) {
            mp1[x1][y1][x2 * 2001 + y2] = cnt++;
        }
    }
    Dinic dinic(m + cnt + 2);
    for(int i = 0; i < m; i++) {
        pair<int, int> tl = g[i].first;
        pair<int, int> br = g[i].second;
        int area = (br.first - tl.first) * (br.second - tl.second);

        dinic.add_edge(0, i + 1, 1);
        
        for(int j = max(0LL, tl.first - 4); j <= min(2000LL, br.first + 4); j++) {
            for(int k = max(0LL, tl.second - 4); k <= min(2000LL, br.second + 4); k++) {
            
                for(auto ending: s[j][k]) {
                    int p = ending.first.first;
                    int q = ending.first.second;
                    int x1 = max(j, tl.first);
                    int y1 = max(k, tl.second);
                    int x2 = min(p, br.first);  
                    int y2 = min(q, br.second);
                    int area1 = (y2 - y1) * (x2 - x1);
                    if(2 * area1 >= area and y2 >= y1 and x2 >= x1) {
                        //cout << i + 1 << " " << m + mp1[{j, k, p, q}] << "\n";
                        dinic.add_edge(i + 1, m + mp1[j][k][p * 2001 + q], 1);
                    }
                }
            }
        }
        // if(flag == 1) {
        //     cout << i << "\n";
        // }
    }
    for(int i = 0; i < n; i++) {
        int p, q, r, z;
        p = d[i].first.first;
        q = d[i].first.second;
        r = d[i].second.first;
        z = d[i].second.second;
        int val = mp1[p][q][r * 2001 + z];
        if(s[p][q][{r, z}] != 0) {
            dinic.add_edge(m + val, m + cnt + 1, s[p][q][{r, z}]);
            s[p][q][{r, z}] = 0;
        }
    } 
    // for(auto x: mp1) {
    //     //cout << m + x.second << " " << m + cnt + 1 << " " << s[x.first[0]][x.first[1]][{x.first[2], x.first[3]}] << "\n";
        
    //     dinic.add_edge(m + x.second, m + cnt + 1, s[x.first[0]][x.first[1]][{x.first[2], x.first[3]}]);
    // }
    //cout << "reached\n";
    cout << dinic.flow(0, m + cnt + 1) << "\n";
}
signed main(){

    // ios_base::sync_with_stdio(false);
    // cin.tie(0);
    // cout.tie(0);
    int tc;
    cin>>tc;
    while(tc--)
    solve();
    
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 161ms
memory: 379036kb

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: 132ms
memory: 378972kb

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: 3633ms
memory: 518536kb

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: 869ms
memory: 496012kb

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: 807ms
memory: 414464kb

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: -100
Time Limit Exceeded

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: