QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#524260 | #5668. Cell Nuclei Detection | ucup-team3699# | RE | 35ms | 100648kb | C++14 | 3.7kb | 2024-08-19 14:25:19 | 2024-08-19 14:25:20 |
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;
}
struct Edge{
int to, cap, flow;
};
vector<Edge>edge;
vector<int> node[N + 5];
int cur[N + 5], dep[N + 5];
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;
}
};
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;
dinic din;
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: 32ms
memory: 100648kb
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: 100436kb
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: -100
Runtime Error
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 ...