QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#225418 | #5668. Cell Nuclei Detection | BUET_Twilight# | TL | 3759ms | 518492kb | C++23 | 6.3kb | 2023-10-24 17:12:13 | 2023-10-24 17:12:14 |
Judging History
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: 144ms
memory: 379148kb
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: 184ms
memory: 378980kb
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: 3759ms
memory: 518492kb
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: 733ms
memory: 496072kb
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: 677ms
memory: 414448kb
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...